在通过字节流读取utf-16的文件时,我发现得到的字节数组,最前面的两个字节总是-2 -1,于是就查了下资料,总结如下。
UTF-16有如下几种情形(utf-16中一个代码单元由两个字节组成):
- UTF-16BE,其后缀是 BE 即 big-endian,代表大端 ,就是将代码单元的编码从低位,也就是后一个字节开始赋值。
- UTF-16LE,其后缀是 LE 即 little-endian,代表小端,就是将代码单元的编码从高位,也就是前一个字节开始赋值。
- UTF-16,没有指定后缀,即不知道其是大小端,所以字节流开始的两个字节会表示大小端。即0XFE 0XFF表示大端,0XFF 0XFE表示小端。
例如,UTF-16BE下,'A’的编码位0x00 0x41;UTF-16LE下,编码为0x41 0x00。
注意代码单元的码点值是不变的,UTF-BE从后位赋值,此时会从左往右读,UTF-LE从前位赋值,代此时会从右往左读。
0XFF,也就是11111111,此时转为byte值,二进制的赋值是以补码的形式的,此时原码为10000001,也就是-1,同理可得0XFE为-2
所以-2 -1代表你是以UTF-16 BE的形式读取文件的,-1 -2代表UTF-16 LE的形式,如果你在读取时指定了BE或者LE,前面就不出现这两个字节了。