【问题标题】:Is a Java char array always a valid UTF-16 (Big Endian) encoding?Java char 数组是否始终是有效的 UTF-16(Big Endian)编码?
【发布时间】:2025-12-30 09:00:10
【问题描述】:

假设我将 Java 字符数组 (char[]) 实例编码为字节:

  • 每个字符使用两个字节
  • 使用大端编码(将最高有效 8 位存储在最左边的字节中,将最低有效 8 位存储在最右边的字节中)

这会始终创建有效的 UTF-16BE 编码吗?如果不是,哪些代码点会导致编码无效?


这个问题与this question about the Java char typethis question about the internal representation of Java strings非常相关。

【问题讨论】:

    标签: java arrays unicode character-encoding char


    【解决方案1】:

    没有。您可以创建包含您想要的任何 16 位值的 char 实例——没有任何东西将它们限制为有效的 UTF-16 代码单元,也没有将它们的数组限制为有效的 UTF-16 序列。即使String 也不要求其数据是有效的UTF-16:

    char data[] = {'\uD800', 'b', 'c'};  // Unpaired lead surrogate
    String str = new String(data);
    

    Unicode 标准的Chapter 3 中规定了有效 UTF-16 数据的要求(基本上,所有内容都必须是 Unicode 标量值,并且所有代理项必须正确配对)。您可以测试 char 数组是否是有效的 UTF-16 序列,并使用 CharsetEncoder 将其转换为 UTF-16BE(或 LE)字节序列:

    CharsetEncoder encoder = Charset.forName("UTF-16BE").newEncoder();
    ByteBuffer bytes = encoder.encode(CharBuffer.wrap(data)); // throws MalformedInputException
    

    (如果你有字节,同样使用CharsetDecoder。)

    【讨论】:

    • 如果 String 只包含有效的 Unicode,那么 toCharArray() 必然是有效的 UTF-16BE --- 但是,正如我所提到的,String 不验证其内容,因此由您来检查。
    最近更新 更多