定义一个字符串
String name = "堂";
这个字符串就一个字符,把它取出来
char c_name = name.charAt(0);
JAVA里的char型是十六位的(两个字节),但是如果是用UTF-8的话可能会不只两位(UTF-8是变长存储的),那看来JAVA本身并不是用UTF-8来保存的,口说无凭,做个实验吧。
首先看看char里保存的内容
int low = (c_name) & 0xff;//取c_name的低位 int high = (c_name >> 8) & 0xff;//取c_name的高位 System.out.println(Integer.toHexString(high) + " " + Integer.toHexString(low)); |
只有两个字节而已(16位),那么真正的UTF-8编码的内容是什么呢,再看看吧。
为了方便,我写了一个辅助方法printbyte,作用是把一个byte数组的每个元素按照十六进制格式打印出来,同样为了方便,我把它作为静态方法。
public static void printbyte(byte[] bt)
{
for (int i = 0; i < bt.length; i++)
{
int hex = (int)bt[i] & 0xff;
System.out.print(Integer.toHexString(hex) + " ");
}
System.out.println(" length = "+bt.length);
}
byte[] utf_8 = name.getBytes("utf-8");
printbyte(utf_8);
结果是e5 a0 82 length = 3
哇,三个字节!看来JAVA内部用的真不是UTF-8,那用的是什么呢?UTF-16?看一下便知。
byte[] utf_16 = name.getBytes("utf-16"); printbyte(utf_16); |
byte[] utf_16be = name.getBytes("utf-16be"); printbyte(utf_16be); 结果出来了:58 02 length = 2 |