搜尋

首頁  >  問答  >  主體

java - UTF-16编码问题

        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到底是如何编码的呢?求赐教。

黄舟黄舟2819 天前1004

全部回覆(2)我來回復

  • 黄舟

    黄舟2017-04-17 18:01:08

    UTF-16是可變長度的,最少為兩個位元組的編碼格式。因為是兩個字節,就牽扯到Big Endian和Small Endian。你上面的例子因為沒有指定endianess,所以加上兩個位元組的BOM。再加上原來字元(ASCII)編碼的兩個位元組,所以是4個位元組。如果用utf-16-le或utf-16-be,就會是兩個位元組。具體Java如何表示請自查。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 18:01:08

    UTF-16解碼後

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

    開頭都有feff,其用來表示該字串是大端(高位元組放前面),之所以有這個標示是因為系統中存在大端和小端(高位位元組在後面)兩種模式,大端0x01 0x02讀取為0x0102,而同樣的值在小端下讀取值則為0x0201,不同,所以需要在feff來標示。

    回覆
    0
  • 取消回覆