2013-05-27 42 views
15

我需要將Java字符的十六進制代碼生成爲字符串,並在稍後再次解析這些字符串。我發現here語法分析可以如下進行:將Java Char轉換爲Unicode十六進制字符串表示形式,反之亦然

char c = "\u041f".toCharArray()[0]; 

我希望的東西更優雅像Integer.valueOf()解析。

如何正確生成十六進制Unicode?

+0

我發佈了一個答案,但我想我可能會從你想要的東西后退。你能用你想要的輸出例子來澄清一下嗎? – noel

+0

說,對於字符ö,我想'00F6'列在這裏:http://en.wikipedia.org/wiki/List_of_Unicode_characters – JVerstry

+0

好的,那麼我的答案應該工作。 – noel

回答

6

做一些更深入的閱讀後,javadoc中說,基於char參數不支持所有Unicode值Character方法,但那些服用代碼點(即,int)做的。

因此,我一直在執行以下測試:

int codePointCopyright = Integer.parseInt("00A9", 16); 

    System.out.println(Integer.toHexString(codePointCopyright)); 
    System.out.println(Character.isValidCodePoint(codePointCopyright)); 

    char[] toChars = Character.toChars(codePointCopyright); 
    System.out.println(toChars); 

    System.out.println(); 

    int codePointAsian = Integer.parseInt("20011", 16); 

    System.out.println(Integer.toHexString(codePointAsian)); 
    System.out.println(Character.isValidCodePoint(codePointAsian)); 

    char[] toCharsAsian = Character.toChars(codePointAsian); 
    System.out.println(toCharsAsian); 

和我得到:

enter image description here

因此,我不應該在我的問題談char,而是約因爲Unicode字符可以用多個char表示。另一方面,int涵蓋了這一切。

+0

那麼你說得對你的問題中的字符是正確的,這是Java的破碎,並迫使編碼器在編碼細節級WRT到Unicode補充字符串干擾。 –

13

這將生成字符的十六進制字符串表示:

char ch = 'ö'; 
String hex = String.format("%04x", (int) ch); 

,這將十六進制字符串轉換回字符:

int hexToInt = Integer.parseInt(hex, 16); 
char intToChar = (char)hexToInt; 
+0

第一個給我>不能從char []轉換爲int – Machado

+0

@Holmes我使用openjdk 1.8.0_65和javac 1.8.0_60沒有問題。使用上面的或'char c ='\ u041f';'(這是П)或'\ u4e2d'(這是中)。我無法編譯麻將牌(它不在基本的多語言平面中,因此不能用char來表示,所以並不奇怪)。 – Eponymous

5

在串級: 下面的用法不是char,而是int,用於中文,但也適用於字符。

int cp = "\u041f".codePointAt(0); 
    String s = new String(Character.toChars(cp)); 

在native2ascii的水平: 如果你想回來,\uXXXX和Unicode字符之間來回轉換,從阿帕奇使用,公共琅StringEscapeUtils

String t = StringEscapeUtils.escapeJava(s + "ö"); 
    System.out.println(t); 

在命令行native2ascii可以在u-escaped和UTF-8之間來回轉換文件。

相關問題