java 代码点 代码单元

    引用 http://blog.csdn.net/xujinsmile/article/details/8526387java

    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。因此,代码单元的数量并不必定是字符的数量。ui

相关函数:编码

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

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

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
		 */
	}
}
相关文章
相关标签/搜索