2014-05-15 41 views
9

如何在Java中使用Unicode名稱查找字符或整型代碼點?如何通過Java中的(unicode)名稱獲取字符?

例如,如果

Character.getName('\u00e4') 

回報"LATIN SMALL LETTER A WITH DIAERESIS",我該如何進行反向操作使用 「普通」 的Java(即從"LATIN SMALL LETTER A WITH DIAERESIS"'\u00e4'去)?

編輯:要停止我想評論的洪流或我不想,這裏是我會在Python做:

"\N{LATIN SMALL LETTER A WITH DIAERESIS}" # this gives me what I want as a literal 

unicodedata.lookup("LATIN SMALL LETTER A WITH DIAERESIS") # a dynamic version 

現在的問題是:做在同Java的。

而且,順便說一句,我不想​​「打印unicode逃逸」 - 實際上十六進制char很容易,但我想要一個字符軸承給定的名稱。

換句話說我想做Character.getName(int)做的相反。

+0

可能是[如何獲得一個字符(或其類型類別)的Unicode名稱?](http://stackoverflow.com/questions/2443325/java-how-to-get-unicode-name-of -a-character-or-its-type-category) – Jonathan

+1

@Jonathan OP想以相反的方式走 – awksp

+0

user3580294你能解釋一下嗎? –

回答

5

ICU4J圖書館可以幫助你在這裏。它有一個類UCharactergetCharFromName和其他相關的方法,可以從各種類型的字符名稱字符串映射回他們代表的代碼點。但是,如果您使用硬編碼字符名稱(即源代碼中帶引號的字符串文字),那麼翻譯一次會更有效率 - 在源代碼中使用\u轉義並添加註釋必要時輸入全名 - 而不是每次都在運行時解析名稱表。如果字符名稱來自讀取文件或類似內容,那麼顯然您將不得不在運行時進行轉換。

+0

謝謝。我知道ICU4J是所有Unicode頭痛的答案,但我想要「簡單」的Java(如有問題)。 –

+2

@PiotrFindeisen作爲其他答案已經證明,如果你不想使用第三方庫,那麼你基本上必須自己實現相同的一組算法。是什麼讓你自己的重新實現更多的「普通Java」,而不是使用已經爲你完成工作的現有(廣泛使用和測試過的)開源庫? –

+0

差異在於 - 依賴關係。這是非常基本的操作,我一直感到驚訝,沒有理智的「普通Java」答案 - 特別是自從Python有這個以來呢?今天我就是這麼做的:'kcharselect'讓'\ u'轉義並在評論中寫下名字。但是這都是:浪費時間,容易出錯和危險的重複。 –

0

嗯,看源代碼Character.class

public static String getName(int codePoint) { 
    if (!isValidCodePoint(codePoint)) { 
     throw new IllegalArgumentException(); 
    } 
    String name = CharacterName.get(codePoint); 
    if (name != null) 
     return name; 
    ... 
} 

CharacterName是包私有類懶洋洋地初始化SoftReference<byte[]>池角色名字(我認爲)的。尤其是一號線感興趣,雖然,埋了一系列不同的輸入流構造函數裏面:

private static synchronized byte[] initNamePool() { 
    ... 
     return getClass().getResourceAsStream("uniName.dat"); 
    ... 
} 

現在,我一直在做一些挖掘,出於某種原因,這個 uniName.dat似乎並不存在OpenJDK的來源。我確實發現了一個 uniName.dat - 作爲我的TeX Live發行版的一部分,奇怪的是。在十六進制編輯器中打開它顯示了一串字節 - 所以內容以某種方式被編碼。如何,我不知道。 我會再來看看源代碼,但是如果我能解決它,它可能需要一段時間才能解碼。

此外,我的Eclipse副本中的調試程序似乎已損壞(無法由於某種原因解析變量),所以我無法檢查輸入流以嘗試查看它從哪裏讀取。

總之

所以,似乎沒有,你可以在本地Java做到這一點,除非你從CharacterName,或滾動你自己的代碼,解密這個文件覺得像的複製粘貼名稱池代碼(假設你可以找到它)


編輯:找到uniName.dat!在我的機器上,位於resources.jar的Java安裝中。還有一堆字節。所以你可以自己解析這個文件(沒有太多樂趣,涉及很多有趣的東西),或者使用一個庫(上面建議)。因此,如果您僅限於本地Java,則可能需要查看CharacterName課程,然後查看是否可以獲得HashMap<String, Character>的某些內容。

相關問題