2010-03-14 15 views
15

La clase Character en Java define métodos que verifican un argumento dado char para la igualdad con ciertos caracteres Unicode o para pertenecer a alguna categoría de tipo. Estos caracteres y categorías de tipos se nombran.Java: ¿Cómo obtener el nombre Unicode de un personaje (o su categoría de tipo)?

Como se indica en javadoc dado, ejemplos de caracteres nombrados son
HORIZONTAL TABULATION, FORM FEED, ...;
ejemplo para categorías de tipos nombrados son
SPACE_SEPARATOR, PARAGRAPH_SEPARATOR, ...

Sin embargo, siendo byte o int valores en lugar de las enumeraciones, el nombre de este tipo son "oculta" en tiempo de ejecución.

Entonces, existe la posibilidad de obtener nombres de categorías de caracteres y/o tipos en tiempo de ejecución?

Respuesta

13

JDK7 tendrá una función

String getName(int codepoint) 

(LEA: un “método estático” en java.lang.Character clase) que a su vez un punto de código en su nombre oficial Unicode.

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

+1

Parece que es JDK7; http://download.java.net/jdk7/docs/api/java/lang/Character.html#getName%28int%29 –

+0

¿Cómo se obtiene el código de un personaje Unicode? –

9

Sí. Use la biblioteca ICU4J. Tiene todo el UCD y una API para sacarle todo el jugo.

2

La clase Character es compatible con la información de categoría. Mira Character.getType(char) para la categoría. Pero no creo, puedes obtener los nombres de los personajes.

1

Los nombres son standard y se pueden usar sujetos a ciertos limitations.

+3

Oh no, los derechos de autor ... espero que no habrá momentos en que la gente no será capaz de hablar sin aceptar alguna licencia de derechos de autor "Unitalk" .. –

+1

No hay límites en el uso de estos nombres en este tipo de contexto. UTC está feliz de que alguien los use en este tipo de casos. – bmargulies

+0

IIUC, las disposiciones se especifican en el Anexo 1 (a) (b) (c), citado anteriormente. – trashgod

1

He publicado una aplicación .NET aquí: Finding out Unicode character name in .Net

Eso debe ser muy fácil de portar a Java. Todo lo que necesita es descargar la base de datos Unicode: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt, y el equivalente de Java de un método de división de cadenas y una clase de diccionario, de los cuales estoy seguro existen en Java.

Esta es una alternativa simple a la descarga de una biblioteca inflada con toneladas de métodos Unicode que Java y .NET probablemente ya sean compatibles.

0

Para el nombre del personaje, se puede utilizar Character.getName(int). Sin embargo, para la categoría general no es tan conveniente:

// 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))); 
Cuestiones relacionadas