2012-03-23 89 views
11

如何在Java中使用char顯示U + FFFF上方的Unicode字符?字符到Unicode超過U + FFFF在Java?

我需要的是這樣的(如果它是有效的):

char u = '\u+10FFFF'; 
+1

查看[本文檔](http://java.sun.com/developer/technicalArticles/Intl/Supplementary/)。儘管你不能在物理上把超過0xFFFF的字符放到'char'中。 – mpontillo 2012-03-23 06:28:44

回答

18

你不能用一個單一的char(持有一個UTF-16代碼單元)做到這一點,但您可以使用一個String

// This represents U+10FFFF 
String x = "\udbff\udfff"; 

或者:

String y = new StringBuilder().appendCodePoint(0x10ffff).toString(); 

即一個surrogate pair(兩個UTF-16代碼單元結合在一起,形成超出基本多語言平面的單一Unicode代碼點)。當然,你需要什麼來顯示你的數據來應對它...

0

Unicode字符可能需要超過兩個字節,一般不能在字符中保存。

+3

請注意,Java中的char是[2個字節](http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Character.html#MAX_VALUE)。 – mpontillo 2012-03-23 06:30:26

2

Source

char數據類型是基於原始Unicode規範,其定義字符爲固定寬度的16位實體。合法代碼點的範圍現在是U + 0000到U + 10FFFF,稱爲Unicode標量值。

從U + 0000到U + FFFF的一組字符有時被稱爲基本多語言平面(BMP)。代碼點大於U + FFFF的字符稱爲補充字符。 Java 2平臺在char數組和String和StringBuffer類中使用UTF-16表示。在這種表示中,補充字符表示爲一對char值,第一個來自高代理範圍(\ uD800- \ uDBFF),另一個來自低代理範圍(\ uDC00- \ uDFFF)。

因此,char值代表基本多語言平面(BMP)代碼點,包括替代代碼點或UTF-16編碼的代碼單元。一個int值表示所有Unicode代碼點,包括補充代碼點。 int的低位(最低位)21位用於表示Unicode編碼點,而高位(最高位)的11位必須爲零。除非另有說明,關於增補字符和代理char值的行爲如下:

  • 只接受一個char值無法支持增補字符的方法。他們將來自代理範圍的char值視爲未定義的字符。例如,Character.isLetter('\ uD840')將返回false,即使該字符串中任何低代理值後面的該特定值都表示一個字母。

  • 接受int值的方法支持所有Unicode字符,包括補充字符。例如,Character.isLetter(0x2F81A)返回true,因爲代碼點值代表一個字母(CJK表意文字)。

在J2SE API文檔,Unicode代碼點用於字符值U + 0000和U + 10FFFF之間的範圍內,和Unicode代碼單元用於那些的代碼單元的16位char值UTF-16編碼。

2

除了使用StringBuilder,您還可以使用直接在類Character中找到的函數 。功能是 toChars(),並且它具有以下規格:

指定字符(Unicode代碼點)轉換爲存儲在{@code炭}陣列
其UTF-16表示。

所以你不需要完全知道代理對如何看待 like和直接使用代碼點。示例代碼 然後看起來如下:

int x = 0x10FFFF; 
String y = new String(Character.toChars(ch)); 

注意的代碼點的數據類型爲int而不是char。

相關問題