想不到头一篇博文会在这种时候写出来,哼
也罢,不过是为了记录一下而已
废话不多说了,这个是个纠结了很长时间的事情——java中的字符串到底是以什么方式存储,再转换为其他编码的时候又会以什么方式输出——原本已经想得很清楚,但只要过一段时间不接触就会忘,索性写这么个东西来记录一下
总所周知,java中的基本类型 char 是以 UTF-16 编码存储的,可后来知道了 UTF-16 还分大端 和 小端 就纠结了,java 里面的到底是大端还是小端,写个程序试试呗
于是便有了下面这个比较简陋的测试 main 函数,顺便也把别的常用编码看了看
public static void main(String[] args) {
int i, length;
int iChar;
String strTest;
char[] arrChTest;
byte[] bytesTestGBK;
byte[] bytesTestUTF8;
byte[] bytesTestUTF16LE;
byte[] bytesTestUTF16BE;
strTest = "想回到大学时代。。。";
arrChTest = strTest.toCharArray();
try {
bytesTestGBK = strTest.getBytes("GBK");
bytesTestUTF8 = strTest.getBytes("UTF8");
bytesTestUTF16LE = strTest.getBytes("UTF-16LE");
bytesTestUTF16BE = strTest.getBytes("UTF-16BE");
System.out.println("char 类型的:" + arrChTest.length);
for ( i = 0; i < arrChTest.length; ++i ) {
iChar = arrChTest[i];
System.out.printf("%04X ", iChar);
}
System.out.println();
System.out.println("字节序列数组 GBK:" + bytesTestGBK.length);
for ( i = 0; i < bytesTestGBK.length; ++i ) {
System.out.printf("%02X ", bytesTestGBK[i]);
}
System.out.println();
System.out.println("字节序列数组 UTF-8:" + bytesTestUTF8.length);
for ( i = 0; i < bytesTestUTF8.length; ++i ) {
System.out.printf("%02X ", bytesTestUTF8[i]);
}
System.out.println();
System.out.println("字节序列数组 UTF16LE:" + bytesTestUTF16LE.length);
for ( i = 0; i < bytesTestUTF16LE.length; ++i ) {
System.out.printf("%02X ", bytesTestUTF16LE[i]);
}
System.out.println();
System.out.println("字节序列数组 UTF16BE:" + bytesTestUTF16BE.length);
for ( i = 0; i < bytesTestUTF16BE.length; ++i ) {
System.out.printf("%02X ", bytesTestUTF16BE[i]);
}
System.out.println();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
结果:
char 类型的:10
60F3 56DE 5230 5927 5B66 65F6 4EE3 3002 3002 3002
字节序列数组 GBK:20
CF EB BB D8 B5 BD B4 F3 D1 A7 CA B1 B4 FA A1 A3 A1 A3 A1 A3
字节序列数组 UTF-8:30
E6 83 B3 E5 9B 9E E5 88 B0 E5 A4 A7 E5 AD A6 E6 97 B6 E4 BB A3 E3 80 82 E3 80 82 E3 80 82
字节序列数组 UTF16LE:20
F3 60 DE 56 30 52 27 59 66 5B F6 65 E3 4E 02 30 02 30 02 30
字节序列数组 UTF16BE:20
60 F3 56 DE 52 30 59 27 5B 66 65 F6 4E E3 30 02 30 02 30 02
char 可以简单的认为成是 short 类型的
拿第一个字符来说: char = 60F3 , 对应 UTF16LE 的字节 = F3 60,对应 UTF16BE 的字节 = 60 F3,字节按照由低到高输出,乍一看 UTF16BE 编码和 java 的 char 类型是一致的,但是实际上,char 作为数字来说 60 是高位,F3是低位,所以由低到高 F3 60 才是正序,也就是说 char 是 UTF16LE 编码,而非 UTF16BE
有点绕,尤其对于强迫症来说是个灾难,明明“60F3” 与 “60 F3 ” ,不知道别人怎么看,反正一开始我是觉得挺别扭,这东西别太纠结,明白了就好
唉?这么一说好像很简单,那么我之前到底在纠结什么呢?算了,就留给自己看吧