2010-03-14 37 views
15

Java中的Character類定義了一些方法,用於檢查給定的char參數是否與某些Unicode字符相等或屬於某個類型類別。這些字符和類型類別被命名。Java:如何獲得一個字符(或其類型分類)的Unicode名稱?

如在給定的javadoc中所述,指定字符的示例是
HORIZONTAL TABULATIONFORM FEED,...;
例如名爲類型類別
SPACE_SEPARATORPARAGRAPH_SEPARATOR,...

然而,作爲byteint值,而不是枚舉,這些類型的名稱是「隱藏」在運行時。

那麼,是否有可能在運行時獲取字符和/或類型類別的名稱?

回答

13

JDK7將有

String getName(int codepoint) 

功能(閱讀:類java.lang.Character「靜態方法」),將轉碼點到其正式名稱的Unicode。

的Javadoc:http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#getName%28int%29

+1

似乎是JDK7; http://download.java.net/jdk7/docs/api/java/lang/Character.html#getName%28int%29 – 2011-04-19 16:37:15

+0

如何從unicode字符獲取代碼點? – 2016-06-23 01:18:52

9

是的。使用ICU4J庫。它有一個完整的UCD和一個API來解決問題。

2

Character類支持類別信息。查看該類別的Character.getType(char)。但我不認爲,你可以得到人物的名字。

1

名稱爲standard,可能會使用某些limitations

+3

哦,不,版權......我希望不會再有時間,人們將無法不接受一些「Unitalk」版權許可說話.. – 2010-03-14 21:13:20

+1

在這種情況下使用這些名稱沒有限制。 UTC很高興有人在這種情況下使用它們。 – bmargulies 2010-03-19 16:10:34

+0

IIUC,規定在上面引用的附錄1(a)(b)(c)中規定。 – trashgod 2010-03-19 16:32:10

1

我在這裏發表.NET實現:Finding out Unicode character name in .Net

這應該是很容易移植到Java。所有你需要的是下載Unicode數據庫:http://www.unicode.org/Public/UNIDATA/UnicodeData.txt,以及一個字符串分裂方法和一個Dictionary類的Java等價物,我肯定這兩者都存在於Java中。

這是一個簡單的替代方案,可以下載一些臃腫的庫,其中包含Java和.NET可能已經支持的大量Unicode方法。

0

對於字符的名稱,可以使用Character.getName(int)。然而,對於普通類也不是那麼方便:

// attach String names to Character constants 
Map<Byte, String> unicodeCategories = new HashMap<>(); 
unicodeCategories.put(Character.COMBINING_SPACING_MARK, "Mc"); 
unicodeCategories.put(Character.CONNECTOR_PUNCTUATION, "Pc"); 
unicodeCategories.put(Character.CONTROL, "Cc"); 
unicodeCategories.put(Character.CURRENCY_SYMBOL, "Sc"); 
unicodeCategories.put(Character.DASH_PUNCTUATION, "Pd"); 
unicodeCategories.put(Character.DECIMAL_DIGIT_NUMBER, "Nd"); 
unicodeCategories.put(Character.ENCLOSING_MARK, "Me"); 
unicodeCategories.put(Character.END_PUNCTUATION, "Pe"); 
unicodeCategories.put(Character.FINAL_QUOTE_PUNCTUATION, "Pf"); 
unicodeCategories.put(Character.FORMAT, "Cf"); 
unicodeCategories.put(Character.INITIAL_QUOTE_PUNCTUATION, "Pi"); 
unicodeCategories.put(Character.LETTER_NUMBER, "Nl"); 
unicodeCategories.put(Character.LINE_SEPARATOR, "Zl"); 
unicodeCategories.put(Character.LOWERCASE_LETTER, "Ll"); 
unicodeCategories.put(Character.MATH_SYMBOL, "Sm"); 
unicodeCategories.put(Character.MODIFIER_LETTER, "Lm"); 
unicodeCategories.put(Character.MODIFIER_SYMBOL, "Sk"); 
unicodeCategories.put(Character.NON_SPACING_MARK, "Mn"); 
unicodeCategories.put(Character.OTHER_LETTER, "Lo"); 
unicodeCategories.put(Character.OTHER_NUMBER, "No"); 
unicodeCategories.put(Character.OTHER_PUNCTUATION, "Po"); 
unicodeCategories.put(Character.OTHER_SYMBOL, "So"); 
unicodeCategories.put(Character.PARAGRAPH_SEPARATOR, "Zp"); 
unicodeCategories.put(Character.PRIVATE_USE, "Co"); 
unicodeCategories.put(Character.SPACE_SEPARATOR, "Zs"); 
unicodeCategories.put(Character.START_PUNCTUATION, "Ps"); 
unicodeCategories.put(Character.SURROGATE, "Cs"); 
unicodeCategories.put(Character.TITLECASE_LETTER, "Lt"); 
unicodeCategories.put(Character.UNASSIGNED, "Cn"); 
unicodeCategories.put(Character.UPPERCASE_LETTER, "Lu"); 
// use the map to extract category name from the constant 
char ch = 'a'; // OR int ch = Character.codePointAt("a", 0); 
String category = unicodeCategories.get((byte) (Character.getType(ch))); 
相關問題