【问题标题】:When encoding a UTF-8 string with 3 character bytes how come the length only increases by 1当用 3 个字符字节编码 UTF-8 字符串时,长度如何只增加 1
【发布时间】:2021-11-01 07:28:20
【问题描述】:

所以我试图确保我正确理解编码,所以我编写了一个示例测试:

public class TestEncoding {

    public static void main(String[] args) throws UnsupportedEncodingException {
        TestEncoding testEncoding = new TestEncoding();
        testEncoding.isLengthDifferenceBetweenUTF16UTF32();
    }

    private void isLengthDifferenceBetweenUTF16UTF32() throws UnsupportedEncodingException {
        String eightBitString = new String("Hi how are you?ࢤ".getBytes(StandardCharsets.UTF_8));
        String sixteenBitString = new String("Hi how are you?ࢤ".getBytes(StandardCharsets.UTF_16LE));
        String thirtyTwoBitString= new String("Hi how are you?ࢤ".getBytes("UTF-32"));

        System.err.println("8 bit: " + eightBitString.length());
        System.err.println("16 bit: " + sixteenBitString.length());
        System.err.println("32 bit: " + thirtyTwoBitString.length());
    }
}

然后我得到输出:

8 bit: 16
16 bit: 32
32 bit: 64

我的问题是为什么Hi how are you?末尾的特殊字符不变成15,对于Hi how are you?+特殊字符3,总共给我18。

【问题讨论】:

  • 请添加正确的编程语言标签。

标签: java unicode encoding utf-8


【解决方案1】:
String eightBitString = new String("Hi how are you?ࢤ".getBytes(StandardCharsets.UTF_8));
String sixteenBitString = new String("Hi how are you?ࢤ".getBytes(StandardCharsets.UTF_16LE));
String thirtyTwoBitString= new String("Hi how are you?ࢤ".getBytes("UTF-32"));

这些行获取一个字符串,将它们转换为指定字符集中的字节,然后将它们转换回 JVM 的默认字符集中的字符串。

这取决于默认值是什么,但字节序列可能在默认字符集中无效。在这种情况下,字符串将包含无效序列的占位符字符。它们在结果字符串中看起来像 ,这是一个单个字符。

例如,如果默认字符集是 UTF-8,那么这 3 个字符串是:

Hi how are you?ࢤ
Hi how are you?�
Hi how are you?�

如果您想比较这些字符集中字节表示的长度,请不要转换回字符串:

byte[] eightBit = "Hi how are you?ࢤ".getBytes(StandardCharsets.UTF_8);
System.out.println(eightBit.length);

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2021-01-02
    • 2011-07-02
    相关资源
    最近更新 更多