java - UTF-16编码问题
黄舟
黄舟 2017-04-17 17:59:08
0
2
969
        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 は、最小 2 バイトの可変長エンコード形式です。 2バイトなのでビッグエンディアンとスモールエンディアンが関係します。上記の例では、エンディアンが指定されていないため、2 バイトの BOM が追加されます。元の文字 (ASCII) エンコードの 2 バイトを加えたので、4 バイトになります。 utf-16-le または utf-16-be を使用する場合は 2 バイトになります。特定の Java 表現については自分で確認してください。

いいねを押す +0
刘奇

UTF-16 デコード後

リーリー

の先頭に feff が付いていますが、これは文字列がビッグエンディアンであることを示すために使用されます (上位バイトが先頭にあります)。 このマークが付いているのは、ビッグエンディアンには 2 種類があるためです。システム上、0x01 0x02 はビッグエンディアンでは 0x0102 として読み取られ、リトルエンディアンでは 0x0201 として読み取られ、異なるため必要となります。 feffでマークされます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート