2012-07-16 36 views
18

En mi aplicación obtengo la información de usuario de LDAP y, a veces, el nombre de usuario completo viene con un juego de caracteres incorrecto. Por ejemplo:¿Cómo verificar el conjunto de caracteres de cadena en Java?

ТеÑÑ61 ТеÑÑовиÑ61 

También puede estar en inglés o en ruso y mostrarse correctamente. Si el nombre de usuario cambia, se actualiza en la base de datos. Incluso si cambio el valor en el db, no resolverá el problema.

puedo solucionarlo antes de guardar al hacer esto

new String(incorrect.getBytes("ISO-8859-1"), "UTF-8"); 

Sin embargo, si lo voy a utilizar para la cadena incluyendo caracteres en ruso (por ej., "Тест61 Тестович61") me sale algo como esto " ???? 61 ???????? 61 ".

¿Puede sugerir algo que pueda determinar el juego de caracteres de la cuerda?

+0

Oh, no, nunca lo había notado, pero he estado votando por las respuestas. Ahora lo sabré, gracias por señalarlo por mí. –

Respuesta

10

Las cadenas en Java, AFAIK, no conservan su codificación original, siempre se almacenan internamente en alguna forma Unicode. Desea detectar el juego de caracteres de la secuencia/bytes originales; esta es la razón por la que creo que su llamada a String.toBytes() es demasiado tarde.

ideal sería que si usted podría conseguir el flujo de entrada que está leyendo, usted puede ejecutar a través de algo como esto: http://code.google.com/p/juniversalchardet/

Hay un montón de otros detectores charset por ahí también

+0

¡Muchas gracias por su ayuda! No estoy seguro si puedo obtener la secuencia de entrada cas, los datos del usuario se toman del contexto usando UserService. Otra forma es probablemente corregir valores en LDAP. –

0

En su web- aplicación, puede declarar un filtro de codificación que asegure que recibe datos en la codificación correcta.

<filter> 
    <description>Explicitly set the encoding of the page to UTF-8</description> 
    <filter-name>encodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

Un resorte de filtro proporcionado se asegura de que los controladores/servlets recibir parámetros en UTF-8.

+1

Esto solo se aplica a una aplicación de primavera.Además, forzar la codificación puede no funcionar si se utiliza autenticación básica. –

1

Su base de datos LDAP está configurada incorrectamente. La aplicación que ingresa datos debe convertir a una codificación de juego de caracteres conocida, en su caso, probable UTF_16. Elija un estándar. Todos los métodos de detección de codificación son conjeturas.

La aplicación que escribe el valor es la única que sabe definitivamente qué codificación está utilizando y puede convertir correctamente a otra codificación como UTF_16.

1

Recomiendo Apache.tika CharsetDetector, muy amable y fuerte.

CharsetDetector detector = new CharsetDetector(); 
detector.setText(yourStr.getBytes()); 
detector.detect(); // <- return the result, you can check by .getName() method 

Además, puede convertir cualquier cadena codificada a su deseado, tome UTF-8 como ejemplo:

detector.getString(yourStr.getBytes(), "utf-8"); 
0

que tenían el mismo problema. Tika es demasiado grande y juniversalchardet no detecta ISO-8859-1. Por lo tanto, lo hice a mí mismo y ahora está funcionando bien en la producción:

public String convert(String value, String fromEncoding, String toEncoding) { 
    return new String(value.getBytes(fromEncoding), toEncoding); 
} 

public String charset(String value, String charsets[]) { 
    String probe = StandardCharsets.UTF_8.name(); 
    for(String c : charsets) { 
    Charset charset = Charset.forName(c); 
    if(charset != null) { 
     if(value.equals(convert(convert(value, charset.name(), probe), probe, charset.name()))) { 
     return c; 
     } 
    } 
    } 
    return StandardCharsets.UTF_8.name(); 
} 

Descripción completa aquí: Detect the charset in Java strings.

+0

Hey @ LIuis bienvenido al desbordamiento de la pila, publique un código particular de ese sitio en lugar de solo dar un enlace. – Dilip

+0

Hecho @Dilip ;-) –

Cuestiones relacionadas