2009-05-14 17 views
46

Recientemente tuve que cambiar la codificación de la aplicación web en la que estoy trabajando desde ISO-xx a . Todo fue sin problemas, excepto los archivos de propiedades. Agregué -Dfile.encoding=UTF-8 en eclipse.ini y los archivos normales funcionan bien. Sin embargo, las propiedades muestran un comportamiento extraño.Codificación de las propiedades Java UTF-8 en Eclipse

Si copio las propiedades codificadas utf8 de Notepad ++ y las pego en Eclipse, se muestran y funcionan bien. Cuando me abro de nuevo el archivo de propiedades, veo algunos caracteres Unicode en lugar de los propios, como:

Zur\u00EF\u00BF\u00BDck instead of Zurück 

pero aún aplicación funciona bien. Si comienzo a editar propiedades, agrego algunos caracteres especiales y las guardo, se muestran correctamente, sin embargo, no funcionan y todos los caracteres especiales que anteriormente funcionaban ya no funcionan.

Cuando comparo la versión local con CVS puedo ver los caracteres especiales correctamente en el archivo remoto y después de la actualización estoy de nuevo comenzando: la aplicación funciona, pero Eclipse muestra los caracteres Unicode.

Intenté cambiar la codificación del archivo haciendo clic con el botón derecho y seleccionando "Otro: UTF8" pero no sirvió. También dijo: “determina a partir de contenido: ISO-8859-1”

estoy usando Java 6 y JBoss Developer basado en Eclipse 3.3

puedo vivir con ella mediante la edición de propiedades en Notepad ++ y pegándolos en Eclipse, pero estaría agradecido si alguien pudiera ayudarme a arreglar esto en Eclipse.

Respuesta

51

No pierda su tiempo, puede utilizar Resource Bundle plugin en Eclipse

Basic Screen Shot

Old Sourceforge page

+3

Este es un plugin enormemente útil, gracias por la sugerencia. Tan malo que no tiene una URL de instalación, pero basta con soltarlo en la carpeta de complementos. – chesterbr

+3

¿Utiliza esto la herramienta native2ascii? para caracteres no unicode internamente o debería escapar manualmente símbolos Unicode? –

+0

@ baybora.oren: Expandí .zip en el complemento de la carpeta Eclipse, pero no veo ningún cambio en el ide (I shutdown y reinicie eclipse). ¿Alguna pista? – Sefran2

62

Los archivos de propiedades son ISO-8859-1 por definición; consulte los documentos para la clase Properties.

Spring tiene un reemplazo que puede cargarse con una codificación específica, utilizando PropertiesFactoryBean.

EDIT: Como se señaló Laurence en los comentarios, Java 1.6 introduce sobrecargas para load y store que toman un Reader/Writer. Esto significa que puede crear un lector para el archivo con la codificación que desee y pasarlo al load. Desafortunadamente FileReaderaún no le permite especificar la codificación en el constructor (aargh) por lo que se le va a encajar el encadenamiento FileInputStream y InputStreamReader juntos. Sin embargo, funcionará.

Por ejemplo, para leer un archivo con UTF-8:

Properties properties = new Properties(); 
InputStream inputStream = new FileInputStream("path/to/file"); 
try { 
    Reader reader = new InputStreamReader(inputStream, "UTF-8"); 
    try { 
     properties.load(reader); 
    } finally { 
     reader.close(); 
    } 
} finally { 
    inputStream.close(); 
} 
+5

En Java 1.6 puede utilizar otras codificaciones utilizando los métodos que utilizan Reader/Writer en lugar de InputStream/OutputStream. –

+0

Una solución más general que el de la respuesta aceptada, por lo tanto mejor :) –

12

No es un problema con Eclipse. Si está utilizando la clase de Propiedades para leer y almacenar el archivo de propiedades, la clase escapará a todos los caracteres especiales.

From the class documentation:

Al guardar propiedades a una corriente o cargarlos de una corriente, se utiliza el ISO 8859-1 codificación de caracteres. Para los caracteres que no se pueden representar directamente en esta codificación, se usan escapes Unicode; sin embargo, solo se permite un único carácter 'u' en una secuencia de escape. La herramienta native2ascii se puede usar para convertir archivos de propiedades a otras codificaciones de caracteres.

From the API, store() method:

Caracteres menos de \ u0020 y los personajes mayores que \ u007E están escritas como \ uxxxx para el xxxx valor hexadecimal correspondiente.

+0

Estaba skeet'd ... :( –

+3

NetBeans bien muestra las propiedades de los archivos que tienen \ uXXXX escapa y le permite editarlos con caracteres UTF muestran correctamente . ¿por qué no eclipsa En mi opinión esta _es_ un problema con Eclipse – ChrisB

+0

1:?. el modo quantum of solace por haber sido skeet'd – rexford

4

Hay demasiados puntos en el proceso que describe donde pueden ocurrir errores, así que no trataré de adivinar qué está haciendo mal, pero creo que sé lo que está sucediendo bajo el capó.

EF BF BD es la forma codificada en UTF-8 de U+FFFD, el carácter de reemplazo estándar insertado por los decodificadores cuando se encuentran con una entrada mal formada. Parece que su texto se guarda como ISO-8859-1, luego se lee como si fuera UTF-8, luego se guarda como UTF-8, luego se convierte al formato de Propiedades usando native2ascii usando la codificación predeterminada de la plataforma (por ejemplo, Windows- 1252).

ü    => 0xFC    // save as ISO-8859-1 
0xFC   => U+FFFD    // read as UTF-8 
U+FFFD   => 0xEF 0xBF 0xBD  // save as UTF-8 
0xEF 0xBF 0xBD => \u00EF\u00BF\u00BD // native2ascii

Le sugiero que deje solo la propiedad "file.encoding". Como "file.separator" y "line.separator", no es tan útil como cabría esperar. En su lugar, adquiera el hábito de especificar siempre una codificación al leer y escribir archivos de texto.

1

Esto parece funcionar solo para algunos caracteres ... incluyendo caracteres especiales para alemán, portugués, francés. Sin embargo, tuve problemas con los caracteres rusos, hindi y mandarín. Estos no se convierten al formato de propiedades 'native2ascii', sino que se guardan con ?? ?? ??
La única forma en que podría hacer que mi aplicación muestre estos caracteres correctamente es poniéndolos en el archivo de propiedades traducido al formato UTF-8, como \ u0915 en lugar de क o \ u044F en lugar de я. ¿Algún consejo?

+0

usted podría utilizar org.springframework.context.support.ReloadableResourceBundleMessageSource de muelle que soporta UTF 8 archivos de propiedad codificados. Utilizamos Spring para gestionar traducciones en inglés, alemán, francés y chino en aplicaciones web basadas en mvc de primavera. – rexford

9
Properties props = new Properties(); 
URL resource = getClass().getClassLoader().getResource("data.properties");   
props.load(new InputStreamReader(resource.openStream(), "UTF8")); 

funciona como un encanto

:-)

+0

Desafortunadamente props.load, en 1.6, requiere un InputStream y específicamente indica que espera la vieja escuela ISO-8859-1 –

4
Properties props = new Properties(); 
URL resource = getClass().getClassLoader().getResource("data.properties");   
props.load(new InputStreamReader(resource.openStream(), "UTF8")); 

esto funciona bien en Java 1.6. ¿Cómo puedo hacer esto en 1.5, ya que la clase Propiedades no tiene un método para pars InputStreamReader.

-1

Si las propiedades son para XML o HTML, lo más seguro es utilizar las entidades XML. Son más feos de leer, pero significa que el archivo de propiedades puede tratarse como ASCII directo, por lo que nada se arruinará.

Tenga en cuenta que tiene HTML XML entidades que no lo hace, por lo que mantener su seguridad mediante el uso de XML recta: http://www.w3.org/TR/html4/sgml/entities.html

4

Hay manera mucho más fácil:

props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8")); 
1

Puede definir UTF-8 archivos .properties para almacenar sus traducciones y usar ResourceBundle, para obtener valores. Para evitar problemas, puede cambiar la codificación:

String value = RESOURCE_BUNDLE.getString(key); 
return new String(value.getBytes("ISO-8859-1"), "UTF-8");