2010-03-14 55 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))); 
相关问题