繁体   English   中英

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

[英]Java: How to get Unicode name of a character (or its type category)?

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

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

但是,作为byteint值而不是枚举,这些类型的名称在运行时被“隐藏”。

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM