谁解释一下这个输出???            String str = "\ud800\udc00";
            System.out.println(str.codePointCount(0,str.length())); //1 
            System.out.println("0x"+Integer.toHexString(str.codePointAt(0))); //0x10000
            System.out.println("0x"+Integer.toHexString(str.codePointAt(1))); //0xdc000x10000代表什么?
0xdc00代表什么?为什么str.codePointCount(0,str.length())
返回1,却仍然可以拿到索引为1的代码点呢?谢谢谢谢。。

解决方案 »

  1.   

    jf对这个不感兴趣,但是缺分由于\ud800是 utf-16
    取\ud800最为高位取下个char做为底位计算
    最后换算是这个结果
     ((\uD800 - \uD800) << 10)
                + (\udc00 - \uDC00) + 0x010000;你分太多了,需要消费下
        public static int toCodePoint(char high, char low) {
            return ((high - MIN_HIGH_SURROGATE) << 10)
                + (low - MIN_LOW_SURROGATE) + MIN_SUPPLEMENTARY_CODE_POINT;
        }
      

  2.   

    Unicode 字符表示形式
    char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10FFFF,即通常所说的 Unicode 标量值。(请参阅 Unicode 标准中 U+n 表示法的定义。) 从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符。Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。 所以,char 值表示 Basic Multilingual Plane (BMP) 代码点,其中包括代理项代码点,或 UTF-16 编码的代码单元。int 值表示所有 Unicode 代码点,包括增补代码点。int 的 21 个低位(最低有效位)用于表示 Unicode 代码点,并且 11 个高位(最高有效位)必须为零。除非另有指定,否则与增补字符和代理项 char 值有关的行为如下: 只接受一个 char 值的方法无法支持增补字符。它们将代理项字符范围内的 char 值视为未定义字符。例如,Character.isLetter('\uD840') 返回 false,即使是特定值,如果在字符串的后面跟着任何低代理项值,那么它将表示一个字母。 
    接受一个 int 值的方法支持所有 Unicode 字符,其中包括增补字符。例如,Character.isLetter(0x2F81A) 返回 true,因为代码点值表示一个字母(一个 CJK 象形文字)。 
    在 Java SE API 文档中,Unicode 代码点 用于范围在 U+0000 与 U+10FFFF 之间的字符值,而 Unicode 代码点 用于作为 UTF-16 编码的代码单元的 16 位 char 值。
    一起看看
      

  3.   

    在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。 
      

  4.   

    System.out.println(str.codePointCount(0,str.length())); //1 ,说明字符串里只有一个代码点
                System.out.println("0x"+Integer.toHexString(str.codePointAt(0))); //0x10000
                System.out.println("0x"+Integer.toHexString(str.codePointAt(1))); //为什么这里仍然可以取到第2个?注意看清楚我问的什么啊。。
      

  5.   

    codePointCount
    public int codePointCount(int beginIndex,
                              int endIndex)返回此 String 的指定文本范围中的 Unicode 代码点数。文本范围始于指定的 beginIndex,一直到索引 endIndex - 1 处的 char。因此,该文本范围的长度(用 char 表示)是 endIndex-beginIndex。该文本范围内每个未配对的代理项计为一个代码点。
    codePointAt
    public int codePointAt(int index)返回指定索引处的字符(Unicode 代码点)。索引引用 char 值(Unicode 代码单元),其范围从 0 到 length() - 1。 
    如果给定索引指定的 char 值属于高代理项范围,则后续索引小于此 String 的长度;如果后续索引处的 char 值属于低代理项范围,则返回该代理项对相应的增补代码点。否则,返回给定索引处的 char 值。 
    public int codePointAt(int index)中的index是长度,不是codePointCount
      

  6.   

    str.length是2,codePointCount是1