UTF-16编码问题

 String str1="a"; String str2="b"; String str3="c"; String str4="abc"; System.out.printlnstr1.getBytes"UTF-16".length;//4 System.out.printlnstr2.getBytes"UTF-16".length;//4 System.out.printlnstr3.getBytes"UTF-16".length;//4 System.out.printlnstr4.getBytes"UTF-16".length;//8 System.out.printlnstr1.getBytes"UTF-8".length;//1 System.out.printlnstr2.getBytes"UTF-8".length;//1 System.out.printlnstr3.getBytes"UTF-8".length;//1 System.out.printlnstr4.getBytes"UTF-8".length;//3 System.out.printlnstr1.getBytes"UTF-32".length;//4 System.out.printlnstr2.getBytes"UTF-32".length;//4 System.out.printlnstr3.getBytes"UTF-32".length;//4 System.out.printlnstr4.getBytes"UTF-32".length;//12

Unicde编码中不明白的,像UTF-8/UTF-32中str4编码后字节数都是str1+str2+str3,但UTF-16则不然,UTF-16到底是如何编码的呢?求赐教。

UTF-16是可变长度的,最少为两个字节的编码格式。因为是两个字节,就牵扯到Big Endian和Small Endian。你上面的例子因为没有指定endianess,所以加上两个字节的BOM。再加上原来字符ASCII编码的两个字节,所以是4个字节。如果用utf-16-le或者utf-16-be,就会是两个字节。具体Java如何表示请自查。

UTF-16解码后

feff0061 //a
feff0062 //b
feff0063 //c
feff006100620063 //abc

开头都有feff,其用来表示该字符串是大端高位字节放前面,之所以有这个标示是因为系统中存在大端和小端高位字节在后面两种模式,大端中0x01 0x02读取为0x0102,而同样的值在小端下读取值则为0x0201,不同,所以需要在feff来标示。

发表评论

电子邮件地址不会被公开。 必填项已用*标注