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); |
结果是fe ff 58 02 length = 4,靠,四个字节了。咦?后面的低16位不正是和开始c_name的十六进制表示一样的吗?看来JAVA真正的内部字符编码和UTF-16有或多或少的联系。JAVA内部究竟是用的什么字符编码呢?这个问题我也找了很久,后来在THINK IN JAVA 3rd的12章里看到一个例子出现了UTF-16BE,难道是它?
byte[] utf_16be = name.getBytes("utf-16be"); printbyte(utf_16be); |
结果出来了:58 02 length = 2
哈哈,I got it!不多不少两个字节,内容也一样。果然是它。同时我在里面也看到,UNICODE的编码还有一个LE,这里的BE,LE我想应该是bigendian和littleendian吧。