zoukankan      html  css  js  c++  java
  • Java中的代码点与代码单元

    Unicode标准的核心是一个编码字符集,它为每一个字符分配一个唯一数字。Unicode标准始终使用16进制数字,并且在书写时在前面加上U+,如字符“A”的编码为“U+0041”。 

    有个小技巧就是,在word中输入一个字符,然后按住alt+x就可以将该字符转为unicode显示。

    代码点是指可用于编码字符集的数字。编码字符集定义一个有效的代码点范围,但是并不一定将字符分配给所有这些代码点。有效的Unicode代码点范围是U+0000至U+10FFFF。Unicode4.0将字符分配给一百多万个代码点中的96382个代码点。
    代码单元可以理解为字符编码的一个基本单元,最常用的代码单元是字节(即8位),但是16位和32位整数也可以用于内部处理。

    就Unicode标准来说,它的编码字符集有三种编码方案:UTF-32、UTF-16、UTF-8。UTF-32使用32位的代码单元表示一个Unicode代码点,UTF-16使用一个或两个16位的代码单元的序列对Unicode代码点进行编码,UTF-8 使用1至4个字节的序列对Unicode代码点进行编码。

    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编码标识的给定字符串所需要的代码点的数量。

    public class Test{
        public static void main(String...args){        
            char[] ch = Character.toChars(0x10400);
            System.out.printf("U+10400 高代理字符: %04x
    ", (int)ch[0]);//d801
            System.out.printf("U+10400 低代理字符: %04x
    ", (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
             */
        }
    }

    下面部分转自 http://blog.csdn.net/xujinsmile/article/details/8526387

     
  • 相关阅读:
    (Java实现) 删数问题
    (Java实现) 车站
    (Java实现) 活动选择
    (Java实现) 过河卒
    (Java实现) 美元汇率
    (Java实现) 零件分组
    (Java实现) 图的m着色问题
    (Java实现) 数塔问题
    Java实现 蓝桥杯VIP 算法训练 数的划分
    DirectUI的消息流转
  • 原文地址:https://www.cnblogs.com/byron0918/p/4770439.html
Copyright © 2011-2022 走看看