2012-03-23 27 views
11

¿Cómo puedo mostrar un carácter Unicode arriba de U + FFFF usando char en Java?char a Unicode más que U + FFFF en java?

necesito algo como esto (si fuera válida):

char u = '\u+10FFFF'; 
+1

Tome un vistazo a [este documento] (http://java.sun.com/developer/technicalArticles/Intl/Supplementary/). Sin embargo, no se puede poner físicamente más de 0xFFFF en un 'char '. – mpontillo

Respuesta

18

Usted no puede hacerlo con una sola char (que tiene una unidad de código UTF-16), pero se puede utilizar un String :

// This represents U+10FFFF 
String x = "\udbff\udfff"; 

alternativa:

String y = new StringBuilder().appendCodePoint(0x10ffff).toString(); 

Esa es una surrogate pair (dos unidades de código UTF-16 que se combinan para formar un único punto de código Unicode más allá del plano multilingüe básico). Por supuesto, necesita lo que sea que muestre sus datos para lidiar con eso también ...

0

Los caracteres Unicode pueden tomar más de dos bytes que no se pueden mantener en general en un carácter.

+3

Nota, un 'char' en Java es [2-bytes] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Character.html#MAX_VALUE). – mpontillo

2

Source

El tipo de datos CHAR se basan en la especificación Unicode original, que define caracteres como entidades de 16 bits de ancho fijo. El rango de puntos de código legal ahora es U + 0000 a U + 10FFFF, conocido como valor escalar Unicode.

El conjunto de caracteres de U + 0000 a U + FFFF a veces se conoce como el plano multilingüe básico (BMP). Los caracteres cuyos puntos de código son mayores que U + FFFF se llaman caracteres suplementarios. La plataforma Java 2 usa la representación UTF-16 en matrices char y en las clases String y StringBuffer. En esta representación, los caracteres suplementarios se representan como un par de valores char, el primero del rango de sustitutos altos, (\ uD800- \ uDBFF), el segundo del rango de sustitutos bajos (\ uDC00- \ uDFFF).

Un valor de caracteres, por lo tanto, representa los puntos de código de plano multilingüe básico (BMP), incluidos los puntos de código sustituto o las unidades de código de la codificación UTF-16. Un valor int representa todos los puntos de código Unicode, incluidos los puntos de código suplementarios. Los 21 bits más bajos (menos significativos) de int se utilizan para representar puntos de código Unicode y los 11 bits superiores (más significativos) deben ser cero. A menos que se especifique lo contrario, el comportamiento con respecto a los caracteres complementarios y valores CHAR sustitutas es como sigue:

  • Los métodos que sólo aceptan un valor Char no puede apoyar caracteres complementarios. Tratan los valores de char de los rangos de sustitución como caracteres indefinidos. Por ejemplo, Character.isLetter ('\ uD840') devuelve false, aunque este valor específico si es seguido por cualquier valor de bajo sustituto en una cadena representaría una letra.

  • Los métodos que aceptan un valor int admiten todos los caracteres Unicode, incluidos los caracteres suplementarios. Por ejemplo, Character.isLetter (0x2F81A) devuelve verdadero porque el valor del punto de código representa una letra (un ideograma CJK).

En la documentación API J2SE, Unicode punto de código se utiliza para los valores de caracteres en el rango de entre U + 0000 y U + 10FFFF, y la unidad de código Unicode se utiliza para valores CHAR 16 bits que son unidades de código de la codificación UTF-16.

2

En lugar de utilizar StringBuilder, también puede utilizar una función que se encuentra directamente en la clase Carácter. La función es toChars() y tiene la siguiente especificación:

convierte el carácter especificado (Unicode punto de código) para
su representación UTF-16 almacenado en un {@code CHAR} array.

Así que no necesita saber exactamente cómo se parecen los pares de sustitución y trabajar directamente con el punto de código. Un código de ejemplo entonces ve de la siguiente manera:

int x = 0x10FFFF; 
String y = new String(Character.toChars(ch)); 

nota el tipo de datos para el punto de código es de tipo int y no carbón.

Cuestiones relacionadas