2010-03-14 4 views
15

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

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

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

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

ответ

13

JDK7 будет иметь функцию

String getName(int codepoint) 

(читай: «статический метод» в классе java.lang.Character), который будет превратить в элемент кода его официальное название Unicode.

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

+1

Кажется, что это будет JDK7; http://download.java.net/jdk7/docs/api/java/lang/Character.html#getName%28int%29 –

+0

Как вы получаете код из символа Юникода? –

9

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

2

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

1

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

+3

О нет, авторское право ... Я надеюсь, что не будет времени, когда люди не будут в состоянии говорить, не принимая некоторые лицензии авторского права «Unitalk» .. –

+1

Нет ограничений на использование этих имен в этом контексте. UTC рад, что кто-то использует их в таком случае. – bmargulies

+0

IIUC, положения указаны в Приложении 1 (a) (b) (c), процитированном выше. – trashgod

1

Я отправил реализацию .NET здесь: Finding out Unicode character name in .Net

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

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

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)));