日期:2014-05-20  浏览次数:20684 次

java 中Code Points and Code Units 的区别?
看java核心第一卷时,看到如下内容:
The length method yields the number of code units required for a given string in the UTF-16 encoding. For example:

String greeting = "Hello";
int n = greeting.length(); // is 5.



To get the true length, that is, the number of code points, call

int cpCount = greeting.codePointCount(0, greeting.length());


运行代码后,发现结果都是5,不知道有什么区别。


------解决方案--------------------
一般不需要考虑代码单元的长度值,可以简单地认为其与代码点的长度是一样的。

只有增补字符,即代码点为 U+10000~U+10FFFF 的字符。

在 Java 中一个 Unicode 字符是使用 UTF-16 编码的 char 进行表示的,也就是一个 char 只能表示 U+0000~U+FFFF 的 Unicode 基本字符(BMP, basic multilingual plane)。因此在 Java 中需要表示 U+10000~U+10FFFF 的字符需要使用一对代理字符进行表示,高代理字符的范围为 U+D800~U+DBFF,低代理字符的范围为 U+DC00~U+DFFF。比如表示 U+10400 的字符需要两个 char(U+D801, U+DC00)才能表示,这时的代码点长度为 1,而代码单元长度为 2。

举个例子:

Java code
public class Main {

    public static void main(String[] args) {
        char[] chs = Character.toChars(0x10400);
        System.out.printf("U+10400 高代理字符: %04x%n", (int)chs[0]);
        System.out.printf("U+10400 低代理字符: %04x%n", (int)chs[1]);        
        String str = new String(chs);
        System.out.println("代码单元长度: " + str.length());
        System.out.println("代码点数量: " + str.codePointCount(0, str.length()));
    }
}

------解决方案--------------------
再简单地说:

code unit 表示的一个占用着 Unicode 编码位的字符
code point 表示指定编码格式编码的数量,对于小于 U+FFFF 的字符来说,使用 UTF-16 编码需要一个代码点,大于 U+FFFF 的字符需要使用两个代码点来表示
------解决方案--------------------
更详细的介绍可以参考这篇文章

Java 平台中的增补字符
http://java.sun.com/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html
------解决方案--------------------
探讨

再简单地说:

code unit 表示的一个占用着 Unicode 编码位的字符
code point 表示指定编码格式编码的数量,对于小于 U+FFFF 的字符来说,使用 UTF-16 编码需要一个代码点,大于 U+FFFF 的字符需要使用两个代码点来表示