String str1="a";
String str2="b";
String str3="c";
String str4="abc";
System.out.println(str1.getBytes("UTF-16").length);//4
System.out.println(str2.getBytes("UTF-16").length);//4
System.out.println(str3.getBytes("UTF-16").length);//4
System.out.println(str4.getBytes("UTF-16").length);//8
System.out.println(str1.getBytes("UTF-8").length);//1
System.out.println(str2.getBytes("UTF-8").length);//1
System.out.println(str3.getBytes("UTF-8").length);//1
System.out.println(str4.getBytes("UTF-8").length);//3
System.out.println(str1.getBytes("UTF-32").length);//4
System.out.println(str2.getBytes("UTF-32").length);//4
System.out.println(str3.getBytes("UTF-32").length);//4
System.out.println(str4.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解碼後
開頭都有feff,其用來表示該字串是大端(高位元組放前面),之所以有這個標示是因為系統中存在大端和小端(高位位元組在後面)兩種模式,大端0x01 0x02讀取為0x0102,而同樣的值在小端下讀取值則為0x0201,不同,所以需要在feff來標示。