2011-11-09 10 views
15

¿Cómo poner un carácter Unicode suplementario (por ejemplo, codepoint 10400) en un literal de cadena? He intentado poner un par suplente como esto:¿Cómo poner un carácter Unicode suplementario en un literal de cadena?

String text = "TEST \uD801\uDC00"; 
System.out.println(text); 

pero no parece funcionar.

ACTUALIZACIÓN:

La buena noticia es, la cadena se construye correctamente.
matriz de bytes en UTF-8: 54 45 53 54 20 f0 90 90 80
matriz de bytes en UTF-16: Fe ff 0 54 0 45 0 53 0 54 0 20 d8 1 dc 0

Pero la mala la noticia es que no se imprime correctamente (en mi cuadro de Fedora) y puedo ver un cuadrado en lugar del símbolo esperado (mi consola no admite el Unicode correctamente).

+2

¿Qué quiere decir cuando se dice que no parecen funcionar? ¿Cuál es el valor de 'text.charAt (5)'? – Mats

+0

No imprime el símbolo correctamente. Podría ser algo con el flujo de salida. – n0rm1e

+0

Creo que "una pequeña caja" se usa para representar un personaje que el sistema no puede mostrar. Esto puede significar simplemente que la fuente que se utiliza en la pantalla donde intenta ver la salida no proporciona un glifo para ese personaje. – neuralmer

Respuesta

12

"Funciona para mí", ¿cuál es exactamente el problema?

public static void main (String[] args) throws Exception { 
    int cp = 0x10400; 
    String text = "test \uD801\uDC00"; 
    System.out.println("cp: " + cp); 
    System.out.println("found: " + text.codePointAt(5)); 
    System.out.println("len: " + text.length()); 
} 

Salida:

cp: 66560 
found: 66560 
len: 7 

cuenta que la longitud - como la mayoría de los métodos de Cuerda - se ocupa de char s, no caracteres Unicode. Tanto para la increíble compatibilidad con Unicode :)

Happy coding.

+0

'cp: 66560' ' encontrado: 66560' –

+0

Gracias, parece que hay algo mal con el flujo de salida, ya que el byte [] que obtengo de text.getBytes() es correcto. – n0rm1e

+2

@ houman001 Recuerde * siempre * - excepto en aquellos casos que ahora sé sobre;) - especifique una codificación con 'getBytes' :) No sea que" codifique esta cadena en una secuencia de bytes ** usando el juego de caracteres predeterminado de la plataforma ** ". Restricciones similares para 'new String (byte [])'. Si se utiliza la codificación correcta (especificada o no), la salida enviada a la transmisión debe ser correcta, pero el programa (o terminal) del otro lado puede no estar de acuerdo. –

4

que se supone que trabajar usando:

System.out.println(
    "text = " + new String(Character.toChars(h)) 
); 

Pero la salida es:

text = ? 
+2

Suponiendo que h es correcto: 'Sistema.out' codifica los datos al conjunto de caracteres predeterminado del sistema (esto puede ser una conversión con pérdida); el dispositivo en el que está escribiendo debe usar el mismo juego de caracteres (no siempre es el caso); el dispositivo debe tener compatibilidad de fuente para el grafema que desea visualizar. – McDowell

+3

Sin mencionar que si hablamos de la consola de Windows: cuando se accede usando las funciones stdio como Java, se rompe y no puede manejar los caracteres fuera de la página de códigos ANSI (y mucho menos los caracteres de los planos astrales) . – bobince

Cuestiones relacionadas