编码 - codePointCount和length之间的不同结果

时间:2013-11-23 12:21:36

标签: java encoding

我找到了一个棘手的地方,找不到任何答案为什么会发生这种情况。

主要问题是字符串有多长。

是否包含一个或两个字符。

代码:

public class App {
    public static void main(String[] args) throws Exception {
        char ch0 = 55378;
        char ch1 = 56816;
        String str = new String(new char[]{ch0, ch1});
        System.out.println(str);
        System.out.println(str.length());
        System.out.println(str.codePointCount(0, 2));
        System.out.println(str.charAt(0));
        System.out.println(str.charAt(1));
    }
}

输出:

?
2
1
?
?

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

是否包含一个或两个字符。

它包含一个Unicode 字符,它由2个UTF-16 代码单元组成。 Java中的每个char都是UTF-16代码单元......它可能不是一个完整的字符。每个字符都有一个代码点 - Unicode提供编码字符集,将每个字符映射到表示该字符(代码点)的整数。

length()返回代码单元数,而codePointCount返回代码点数。

你可能想查看我关于encodings in .NET的文章 - 所有翻译的术语都很好(因为它是标准术语),所以只需忽略特定于.NET的部分。