2011-11-09 52 views
15

如何在字符串文字中添加一個補充的Unicode字符(比如codepoint 10400)? 我試圖把代理對這樣的:如何在字符串文字中添加補充的Unicode字符?

String text = "TEST \uD801\uDC00"; 
System.out.println(text); 

,但它似乎並沒有工作。

更新:

好消息是,字符串是正確構造的。
以UTF-8字節數組:54 45 53 54 20 F0 90 90 80
字節陣列中UTF-16:FE FF 0 54 0 45 0 53 0 54 0 20 D8 1直流0

但壞新聞是,它沒有正確打印(在我的Fedora框中),我可以看到一個正方形而不是預期的符號(我的控制檯不支持unicode)。

+2

什麼,當你說這似乎並沒有工作,你的意思是? 'text.charAt(5)'的值是多少? – Mats

+0

它不能正確打印符號。它可能與輸出流有關。 – n0rm1e

+0

我相信「小盒子」是用來表示系統無法顯示的字符。這可能只是表示在您嘗試查看輸出的顯示中使用的字體不會爲該字符提供字形。 – neuralmer

回答

12

「適合我」,究竟是什麼問題?

public static void main (String[] args) throws Exception { 
    int cp = 0x10400; 
    String text = "test \uD801\uDC00"; 
    System.out.println("cp: " + cp); 
    System.out.println("found: " + text.codePointAt(5)); 
    System.out.println("len: " + text.length()); 
} 

輸出:

cp: 66560 
found: 66560 
len: 7 

注意長度 - 最喜歡的String方法 - 與char S,不是Unicode字符交易。對於真棒Unicode支持:) :)

快樂編碼。

+0

'cp:66560' 'found:66560' –

+0

謝謝,它看起來像輸出流有問題,因爲我從text.getBytes()得到的byte []是正確的。 – n0rm1e

+2

@ houman001記住* always * - 除了現在我知道的情況;) - 用'getBytes'指定一個編碼:)讓它「使用平臺的默認字符集將這個字符串編碼爲一個字節序列** **」。 '新的字符串(byte [])'類似。如果使用了正確的編碼(指定或其他),則發送到流的輸出應該是正確的:但另一方的程序(或終端)可能不同意。 – 2011-11-09 18:24:59

4

它應該使用的工作:

System.out.println(
    "text = " + new String(Character.toChars(h)) 
); 

但輸出是:

text = ? 
+2

假設h是正確的:'系統。out「將數據編碼爲系統默認字符集(這可能是有損轉換);您正在寫入的設備必須使用相同的字符集(並非總是如此);該設備必須對要顯示的字形支持字體。 – McDowell

+3

更不用說,如果我們談論的是Windows控制檯:當使用stdio函數作爲Java進行訪問時,它已經被破壞,並且根本無法處理ANSI代碼頁之外的字符(更不用說來自Astral Planes的字符了) 。 – bobince