看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。
举个例子:
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 和 code point 的说明正好写反了,呵呵。
那天回复是半夜了,估计我在神游了,哈哈