Java:如何获取字符的Unicode名称(或其类型类别)?

时间:2010-03-14 18:57:37

标签: java unicode character

Java中的Character类定义了检查给定char参数与某些Unicode字符是否相等或属于某种类型类别的方法。这些字符和类型类别已命名。

如给定的javadoc所述,命名字符的例子是
HORIZONTAL TABULATIONFORM FEED,...;
命名类型类别的示例是
SPACE_SEPARATORPARAGRAPH_SEPARATOR,...

但是,如果是byteint值而不是枚举,则这些类型的名称在运行时会“隐藏”。

那么,是否有可能在运行时获取字符和/或类型类别的名称?

6 个答案:

答案 0 :(得分:14)

JDK7将有一个

String getName(int codepoint)

函数(READ:类java.lang.Character中的“静态方法”),它将把代码点转换为其官方Unicode名称。

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

答案 1 :(得分:9)

是。使用ICU4J库。它有一个完整的UCD和一个API来解决它。

答案 2 :(得分:2)

Character类支持类别信息。查看Character.getType(char)类别。但我不认为,你可以获得角色名称。

答案 3 :(得分:1)

我在这里发布了一个.NET实现:Finding out Unicode character name in .Net

这应该很容易移植到Java。您所需要的只是下载Unicode数据库:http://www.unicode.org/Public/UNIDATA/UnicodeData.txt,以及字符串拆分方法和Dictionary类的Java等价物,我确信它们都存在于Java中。

这是使用大量Unicode方法下载一些膨胀库的简单替代方法,Java和.NET可能都支持这些方法。

答案 4 :(得分:0)

名称为standard,可能会使用某些limitations

答案 5 :(得分: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) ) );