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
		 */
	}
}
相關文章
相關標籤/搜索