2011-04-20 13 views
12

¿Cómo puedo obtener el valor unicode de una cadena en java?Java String Valor Unicode

Por ejemplo, si la cadena es "Hola" necesito algo como \ uXXXX \ uXXXX

+3

¿Por qué? ¿Qué estás tratando de hacer exactamente? 'charAt()' ayudará. Si desea puntos de código Unicode en lugar de unidades de código UTF-16, entonces 'codePointAt()' es el enfoque más correcto (pero eso no ayudará si desea escribir '\ u' escapes para el código fuente de Java o similar). –

+0

Para simplificar todo, tengo una cadena que está en inglés de un archivo fuente java. Se convierte a japonés. Entonces necesito el valor unicode \ uXXXX porque la cadena en inglés se reemplazará por el japonés en el archivo fuente. – user489041

+0

@user: en ese caso, debería formatear el valor devuelto por 'charAt()' como un número hexadecimal de 4 dígitos y anteponer '\ u'. –

Respuesta

18

Algunos caracteres Unicode abarcan dos caracteres Java. Presupuesto de http://docs.oracle.com/javase/tutorial/i18n/text/unicode.html:

Los caracteres con valores que están fuera de la gama de 16 bits, y en el intervalo de 0x10000 a 0x10ffff, se llaman caracteres complementarios y se definen como un par de valores de carbonilla.

forma correcta de escapar no ASCII:

private static String escapeNonAscii(String str) { 

    StringBuilder retStr = new StringBuilder(); 
    for(int i=0; i<str.length(); i++) { 
    int cp = Character.codePointAt(str, i); 
    int charCount = Character.charCount(cp); 
    if (charCount > 1) { 
     i += charCount - 1; // 2. 
     if (i >= str.length()) { 
     throw new IllegalArgumentException("truncated unexpectedly"); 
     } 
    } 

    if (cp < 128) { 
     retStr.appendCodePoint(cp); 
    } else { 
     retStr.append(String.format("\\u%x", cp)); 
    } 
    } 
    return retStr.toString(); 
} 
+0

¡Agradable! Buen ejemplo – user489041

11

Este método convierte una arbitraria String a una representación ASCII-seguro para ser utilizado en el código fuente de Java (o archivos de propiedades, por ejemplo):

public String escapeUnicode(String input) { 
    StringBuilder b = new StringBuilder(input.length()); 
    Formatter f = new Formatter(b); 
    for (char c : input.toCharArray()) { 
    if (c < 128) { 
     b.append(c); 
    } else { 
     f.format("\\u%04x", (int) c); 
    } 
    } 
    return b.toString(); 
} 
+0

Impresionante, funcionó a la perfección. Gracias – user489041

+1

@ user489041: No estoy de acuerdo: la forma correcta de hacerlo es compilar con 'java -encoding UTF-8'. Sin desorden, sin problemas. Esto es especialmente porque 20 años después, Java todavía no tiene una forma estándar de hablar sobre los puntos de código por sus nombres oficiales. Eso significa que estás tratando de insertar números de magia malvados y misteriosos en tu código. ¡Eso no es algo bueno! Claro, prefiero ver "\ N {LETRA PEQUEÑA GRIEGA ALPHA}" que "α", pero ** SEGURO ** no quiero ver "\ u03B1"! Eso es simplemente malo. ¿Cómo vas a mantener ese tipo de crudola? – tchrist

+0

¿Solo 4 dígitos? Unicode es un conjunto de caracteres de 32 bits y OP habla de japonés. – Martin