2010-06-07 8 views
7

Recientemente descubrí que confiar en la codificación predeterminada de JVM causa errores. Debo utilizar explícitamente codificación específica ex. UTF-8 mientras se trabaja con String, InputStreams etc. Tengo una gran base de código para escanear para garantizar esto. ¿Podría alguien sugerirme alguna forma más sencilla de verificar esto que buscar en toda la base de código?Cómo asegurar si el programa java usa la codificación UTF-8

Gracias Nayn

+0

He leído la publicación: http: // stackoverflow.com/questions/1749064/how-to-find-default-charset-encoding-in-java – Nayn

+0

¿Está especificando codificación en lugar de utf8 en alguna parte? Por defecto, las cadenas en java son utf8, así que no veo un problema aquí. –

+2

@Imre: los problemas se manifestarán siempre que lea/escriba esos caracteres como caracteres de/a una fuente externa que espera/usa una codificación diferente (por defecto), p. el sistema de archivos de disco, un almacén de datos (base de datos), una conexión de red (HTTP), etc. – BalusC

Respuesta

3

No es una respuesta directa, pero para facilitar el trabajo es bueno saber que en un IDE poco decente puede simplemente buscar para las ocurrencias usadas de InputStreamReader, OutputStreamWriter, String#getBytes() , String(byte[]), Properties#load(), URLEncoder#encode(), URLDecoder#decode() y consorte en el que puede pasar el juego de caracteres y luego actualizar en consecuencia. También desea buscar FileReader y FileWriter y reemplazarlos por las dos primeras clases mencionadas. Es cierto que es una tarea tediosa, pero vale la pena y preferiría que se basara en detalles específicos de enriquecimiento.

En Eclipse, por ejemplo, seleccione el proyecto (s) de interés, golpeó Ctrl + H, cambiar a la solapa Java búsqueda, introduzca por ejemplo InputStreamReader, marque la Buscar opción Constructor , elija Fuentes como el único Busque en la opción y ejecute la búsqueda.

+0

+1 es bueno mencionar el 'InputStreamReader' y los" me gusta ". – Bozho

+1

'FileReader' es el malvado. No sé de una lista completa de estos métodos/constructores de API peligrosos. –

4
System.getProperty("file.encoding") 

devuelve la codificación VM para operaciones I/O

Se puede establecer mediante el paso -Dfile.encoding=utf-8

+1

Por favor, vea el hilo que mencioné en el comentario. La propiedad anterior es un detalle de implementación interna para la implementación de JVM específica. El uso de esta propiedad varía en Java 1.5 y 1.6. – Nayn

+0

no lo es. Lea la respuesta aceptada por completo :) Esta es una configuración estándar que determina el juego de caracteres predeterminado. – Bozho

+1

Establecer una propiedad como esta para corregir el código es un hack ultrajante. –

0

depender de codificación predeterminado de JVM provoca errores

De hecho, siempre se debe especificar el conjunto de caracteres cuando la codificación/decodificación.

Si está satisfecho con un juego de caracteres global predeterminado para toda la codificación/descodificación (no siempre suficiente), puede vivir con la respuesta de Bozho: especifique un valor predeterminado fijo en sus argumentos de JVM o en algún inicializador estático.

Pero es una buena práctica para buscar todas las especificaciones de conjunto de caracteres implícitos en su código, y reemplazarlos con una codificación charset explícita: algunos métodos/clases típicas para mirar: FileWriter, FileReader, InputStreamReader, OutputStreamWriter, String#getBytes(), String(byte[]).

+2

Se debe tener en cuenta que 'FileWriter' y' FileReader' no se pueden cambiar para tomar una codificación especificada. Deberían reemplazarse con 'OutputStreamWriter' y' InputStreamReader', respectivamente. – BalusC

0

Si el archivo es manipulado por herramientas nativas en los servidores, es posible que desee establecer la codificación en System.getProperty ("file.encoding"). Me he encontrado con errores en ambos sentidos.

La mejor práctica es saber qué juego de caracteres se usa y configurarlo. Además, si el archivo se utiliza para interactuar con otra aplicación, debe definir el conjunto de caracteres utilizado. Puede ser una página de códigos de Windows o un formato UTF diferente.

Cuestiones relacionadas