2010-01-22 44 views
2

我試圖從utf代碼中創建char字符。我正在從一個文字中讀取這個代碼,這個文件是一個字符映射。所有字符都由其UTF代碼指定。從包含utf代碼的字符串中創建char字符

0020 SPACE
0021感嘆號
0022引號



從文件中讀取代碼後,我最終得到了一個字符串中的代碼。我如何將此代碼(Stirng)轉換爲char?

+0

我不明白這個問題。你有「0020」,並想要相應的字符,就是這樣嗎? – 2010-01-22 22:17:42

+0

是的,就是這樣。 – Omar 2010-01-22 22:21:42

回答

4

的代碼存儲在十六進制,所以我想你想的:

String code = "0021"; 
char c = (char)Integer.parseInt(code, 16); 
System.out.println("Code: " + code + " Character: " + c); 

我認爲沒有你的字符代碼超過可以存儲在一個字符,即字符的Basic Multilingual Plane最大值。由於您的數據格式顯示爲填充爲零的最大長度爲4個十六進制數字,因此我假定您需要考慮的所有字符實際上都是在BMP中。

如果不是這樣,您將需要一個不同的解決方案。見Character.toChars(int)

+0

我已經試過了。但是,一旦你得到像000A Integer.parseInt失敗的代碼。 – Omar 2010-01-22 22:24:51

+2

你還記得16嗎?它意味着將數字視爲十六進制。如果你省略這個參數,它將不起作用。 – 2010-01-22 22:25:46

+0

我的不好,我沒有意識到十六進制的部分。 – Omar 2010-01-22 22:25:54

1

使用Integer.parseInt(String, 16)將其解析爲整數,然後將其轉換爲char。

0

它看起來像UTF-16。要從這些字節創建字符串,請使用:

new String(byte[]{0x00, 0x21}, "UTF-16") 

這會創建一個包含感嘆號的字符串。該字符是charAt(0)。

編輯

可能不是最高效的方法,但它適用於其他的編碼,以及...

編輯

OK,有一個誤解,上面的代碼不是一個解決方案,而是一個關於如何促進String構造函數從特殊編碼中的一系列字節創建String的例子。正如它是一個例子,它看起來是靜態的。這裏是運行時的解決方案(知道尤其是接受的解決方案更適合 - 這一個更一般):

public char decodeUTF16(byte b1, byte b2) { 
    return decode(new byte[]{b1, b2}).charAt(0); 
} 

public String decodeUTF16(byte[] bytes) { 
    return decode(bytes, "UTF-16"); 
} 

public String decode(byte[] bytes, String encoding) { 
    return new String(bytes, encoding); 
} 
+0

downvote的任何理由? – 2010-01-22 22:47:39

+0

@Andreas_D:因爲OP希望有一個運行時解決方案,因此您需要編譯時間,並提及並濫用UTF-16。 OP通過ParseInt()函數將其解碼爲int後,它已經具有十六進制的Unicode字符點),它們不需要UTF-16解碼。 'char c =(char)0x0020'另一方面將是一個寶貴的貢獻,我會建議編輯它。 – 2010-01-22 22:55:19

+0

這是一個例子。只是一個例子。 – 2010-01-22 23:06:15