java 代码点和代码单元


原文链接:http://blog.youkuaiyun.com/xujinsmile/article/details/8526387


最近看core Java,之前一直不明白,看了不少帖子和博客,总算搞明白了。

Java中,char[]、String、StringBuilder和StringBuffer类中采用了UTF-16编码,使用U+0000~U+FFFF来表示一个基本字符(BMP字符),但是位于U+D800到U+DBFF和U+DC00到U+DFFF的char被视为无定义字符。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。即:基本字符用一个char表示,辅助字符使用一对char表示

Java使用代码点(Unicode code pointer)这个概念来表示范围在U+0000与U+10FFFF之间的字符值(int型),代码单元(Unicode code unit)表示作为UTF-16编码的代码单元的 16位char值(char型)。也就是说,可能存在一个字符,它的代码点数量是1,而代码单元数量是2。所以,代码单元的数量并不一定是字符的数量。

相比之下,代码单元更加偏底层


相关函数:

length()函数返回采用UTF-16编码标识的给定字符串所需要的代码单元的数量。

codePointCount()函数返回采用UTF-16编码标识的给定字符串所需要的代码点的数量。


测试程序:

package com.xujin;  
  
public class Test{  
    public static void main(String...args){       
        char[] ch = Character.toChars(0x10400);  
        System.out.printf("U+10400 高代理字符: %04x\n", (int)ch[0]);//d801  
        System.out.printf("U+10400 低代理字符: %04x\n", (int)ch[1]);//dc00     
        String str = new String(ch);  
        System.out.println("代码单元长度: " + str.length());//2  
        System.out.println("代码点数量: " + str.codePointCount(0, str.length()));//1  
        System.out.println(str.codePointAt(0));//返回给定位置开始或结束的代码点,66560  
        System.out.println(str.charAt(1));//返回给定位置的代码单元,由于未定义,返回?  
          
        //遍历一个字符串,打印出所有字符的代码点  
        str += "Hello,world!";  
        int i = 0;  
        int cp = str.codePointAt(i);  
        while(i < str.length()){  
            System.out.println(str.codePointAt(i));  
            if(Character.isSupplementaryCodePoint(cp))  
                i += 2;//如果cp所在的位置是代码点的第一部分,执行此处  
            else i++;  
        }  
        /* 
         * 66560  
         * 72  
         * 108  
         * 111  
         * 119  
         * 114  
         * 100 
         */  
    }  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值