Java: Как получить Unicode-имя персонажа (или его тип категории)? - PullRequest
16 голосов
/ 14 марта 2010

Класс Character в Java определяет методы, которые проверяют заданный аргумент char на равенство с определенными символами Unicode или на принадлежность к какой-либо категории типа. Эти символы и категории типов названы.

Как указано в данном javadoc, примеры именованных символов:
HORIZONTAL TABULATION, FORM FEED, ...;
примером для именованных типов категорий являются
SPACE_SEPARATOR, PARAGRAPH_SEPARATOR, ...

Однако, поскольку значения byte или int вместо перечислений, имена этих типов «скрыты» во время выполнения.

Итак, есть ли возможность получить имена символов и / или типов категорий во время выполнения?

Ответы [ 6 ]

14 голосов
/ 19 апреля 2011

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

9 голосов
/ 14 марта 2010

Да. Используйте библиотеку ICU4J . У него есть весь UCD и API, чтобы извлечь из него что-то.

2 голосов
/ 14 марта 2010

Класс Character поддерживает информацию о категории. Посмотрите на Character.getType(char) для категории. Но я не думаю, что вы можете получить имена персонажей.

1 голос
/ 19 апреля 2011

Я разместил реализацию .NET здесь: Поиск имени символа Unicode в .Net

Это должно быть очень легко портировать на Java. Все, что вам нужно, это загрузить базу данных Unicode: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt, и Java-эквивалент метода разделения строк и класса Dictionary, оба из которых, я уверен, существуют в Java.

Это простая альтернатива загрузке некоторой раздутой библиотеки с тоннами методов Unicode, которые, вероятно, уже поддерживаются Java и .NET.

0 голосов
/ 26 марта 2017

Для имени персонажа можно использовать 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) ) );
0 голосов
/ 14 марта 2010

Имена стандартные и могут использоваться при соблюдении определенных ограничений .

...