java - UTF-16编码问题
黄舟
黄舟 2017-04-17 17:59:08
0
2
960
        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到底是如何编码的呢?求赐教。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(2)
黄舟

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來標示。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!