一般不需要考虑代码单元的长度值,可以简单地认为其与代码点的长度是一样的。只有增补字符,即代码点为 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()));
    }
}

解决方案 »

  1.   

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

  2.   

    更详细的介绍可以参考这篇文章Java 平台中的增补字符
    http://java.sun.com/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html
      

  3.   


    不好意思哦,code unit 和 code point 的说明正好写反了,呵呵。那天回复是半夜了,估计我在神游了,哈哈
      

  4.   

    也在学java,我的理解,代码点就是unicode编码方案确定的一个字符对应的编码值,和字符串里面的字符(比如一个字母,一个汉字)一一对应;
    代码单元就是utf-16实现unicode编码采用的基本单元,基本字符用一个代码单元(16bit)表示,增补字符需要用两个。