[英]Java: How to get Unicode name of a character (or its type category)?
Java中的Character
类定义了一些方法,这些方法检查给定的char
参数是否与某些Unicode字符相等或属于某种类型类别。 这些字符和类型类别已命名。
如给定的javadoc中所述,命名字符的示例是
HORIZONTAL TABULATION
, FORM FEED
,...;
命名类型类别的示例是
SPACE_SEPARATOR
, PARAGRAPH_SEPARATOR
,......
但是,作为byte
或int
值而不是枚举,这些类型的名称在运行时被“隐藏”。
那么, 是否有可能在运行时获取字符和/或类型类别的名称?
JDK7将有一个
String getName(int codepoint)
function(READ:类java.lang.Character中的“静态方法”),它将把代码点转换为其官方Unicode名称。
Javadoc: http : //docs.oracle.com/javase/7/docs/api/java/lang/Character.html#getName%28int%29
是。 使用ICU4J库。 它有一个完整的UCD和一个API来解决它。
Character
类支持类别信息。 查看类别的Character.getType(char)
。 但我不认为,你可以获得角色名称。
我在这里发布了一个.NET实现: 在.Net中找出Unicode字符名称
这应该很容易移植到Java。 您所需要的只是下载Unicode数据库: http : //www.unicode.org/Public/UNIDATA/UnicodeData.txt ,以及Java等效的字符串拆分方法和Dictionary类,我确信这两者都存在在Java中。
这是一个简单的替代方法,可以使用Java和.NET可能已经支持的大量Unicode方法下载一些膨胀的库。
对于字符名称,可以使用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) ) );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.