2014-09-24 28 views
1

當我運行下面的語句,的Java:整數的Unicode表示超過2個字節字符範圍的

System.out.println("Character is "+(char)65534); //equivalent to 0xfffe 
    System.out.println("Character is "+(char)65535); //equivalent to 0xffff 
    System.out.println("Character is "+(char)65536); //equivalent to 0x10000 
    System.out.println("Character is "+(char)65537); //equivalent to 0x10001 

我得到的輸出

Character is _    where _ is \ufffe 
Character is _    where _ is \uffff 
Character is 
Character is 

在閱讀的答案在SO爲什麼這個輸出這是因爲char類型是2字節(這是Java的UTF-16格式發生的情況),所以第3行和第4行的輸出由於超過了2個字節的限制而爲空。所以,我看了String類獲得超過2字節的整數unicode表示。它的一個功能codePointAt返回字符串中一個字符的整數等值。所以,我尋找它的相反/反函數,但似乎沒有這樣的功能。

任何人都可以請我指出一個Java中的標準函數,它具有這樣的功能。如果它不存在,那麼請指導我如何從頭開始獲取代碼點的Unicode代表(Java使用高和低代理來表示3字節以上,因此有兩個代碼點)。

編輯:

的問題基本上是關心顯示爲代碼點打印語句值比0xffff更大的Unicode描繪。

回答

0

Character類提供了以下方法

Character.highSurrogate(codePoint); 
Character.lowSurrogate(codePoint); 

用於檢索替代物,給定一個代碼點。

一旦你有了這些,你可以將它們寫入ByteBuffer並獲得相應的byte[]並用它來創建一個UTF-16編碼的新String

// byte[] bytes = new byte[] { (byte) 0xD8, 0x34, (byte) 0xDD, 0x1E }; 
String text = ""; // new String(bytes, StandardCharsets.UTF_16); 
int codePoint = text.codePointAt(0); 

ByteBuffer buf = ByteBuffer.allocate(4); 
buf.putChar(Character.highSurrogate(codePoint)); 
buf.putChar(Character.lowSurrogate(codePoint)); 
byte[] data = buf.array(); 

// recreated 
String rep = new String(data, StandardCharsets.UTF_16); 
+0

我知道它給出了代理,但是你知道如何打印它的unicode等價物嗎?假設/假設代碼點5647表示å。當這個代碼點需要一個數字,例如345678佔用三個字節的空間時,則在打印語句中,它必須顯示爲unicode字符。所以,我在問如何顯示它。你知道出路嗎? – stackoverflowery 2014-09-25 02:19:36

+0

@NonymousNT哎呀,對不起,我誤解你在找什麼。我的編輯是否澄清事情? – 2014-09-25 03:20:30

0

方法Character.toChars(int)將爲您提供與該代碼點對應的UTF-16系列代碼單元。

所以,你的例子:

System.out.println("Character is " + new String(Character.toChars(65536))); //equivalent to U+10000 

將打印U + 10000( 'B類線形SYLLABLE B008 A'),假設你有一個字體。

相關問題