Java中的Character
类定义了检查给定char
参数与某些Unicode字符是否相等或属于某种类型类别的方法。这些字符和类型类别已命名。
如给定的javadoc所述,命名字符的例子是
HORIZONTAL TABULATION
,FORM FEED
,...;
命名类型类别的示例是
SPACE_SEPARATOR
,PARAGRAPH_SEPARATOR
,...
但是,如果是byte
或int
值而不是枚举,则这些类型的名称在运行时会“隐藏”。
那么,是否有可能在运行时获取字符和/或类型类别的名称?
答案 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) ) );