Pregunta

Duplicar posibles:
Cómo utilizar UTF-8 en las propiedades del recurso con ResourceBundle

Quiero permitir que la internacionalización a mi aplicación Java Swing. Yo uso un archivo de paquete para mantener todas las etiquetas dentro de él.

Como prueba traté de establecer un título sueco a un JButton. Así que en el archivo de paquete que escribí:

nextStepButton=nästa

Y en el código Java que escribí:

nextStepButton.setText(bundle.getString("nextStepButton"));

Sin embargo, los caracteres del título del botón equivocado aparecen en tiempo de ejecución:
text alt

Estoy utilizando la fuente Tahoma, que es compatible con Unicode. Cuando me puse el título del botón manualmente a través del código que aparece bien:

nextStepButton.setText("nästa");

Cualquier idea de por qué se produce un error en el archivo de paquete?

--------------------------------------------> Editar: codificar el título:
He intentado codificar el texto procedente del archivo de paquete utilizando el código:

nextStepButton.setText(new String(bundle.getString("nextStepButton").getBytes("UTF-8")));

Y aún así el resultado es:
text alt

¿Fue útil?

Solución

Según las javadoc , propiedades los archivos se leen utilizando la norma ISO-8859-1.

.. el flujo de entrada / salida se codifica en la norma ISO 8859-1 codificación de caracteres. Los caracteres que no pueden ser representados directamente en esta codificación se puede escribir usando escapes Unicode; Sólo se permite un único carácter 'u' en una secuencia de escape. La herramienta native2ascii se puede utilizar para convertir archivos de propiedades desde y hacia otras codificaciones de caracteres.

Además de utilizar la herramienta para convertir native2ascii UTF-8 archivos de propiedades a ISO 8859-1-archivos de propiedades, también se puede utilizar una costumbre ResourceBundle.Control para que pueda controlar la carga de archivos de propiedades y su uso no UTF-8. He aquí un ejemplo patada de salida:

public class UTF8Control extends Control {
    public ResourceBundle newBundle
        (String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
            throws IllegalAccessException, InstantiationException, IOException
    {
        // The below is a copy of the default implementation.
        String bundleName = toBundleName(baseName, locale);
        String resourceName = toResourceName(bundleName, "properties");
        ResourceBundle bundle = null;
        InputStream stream = null;
        if (reload) {
            URL url = loader.getResource(resourceName);
            if (url != null) {
                URLConnection connection = url.openConnection();
                if (connection != null) {
                    connection.setUseCaches(false);
                    stream = connection.getInputStream();
                }
            }
        } else {
            stream = loader.getResourceAsStream(resourceName);
        }
        if (stream != null) {
            try {
                // Only this line is changed to make it to read properties files as UTF-8.
                bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
            } finally {
                stream.close();
            }
        }
        return bundle;
    }
}

Se usa de la siguiente manera:

ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());

De este modo, no es necesario molestia con la herramienta native2ascii y se termina con archivos de propiedades más fáciles de mantener.

Ver también:

Otros consejos

Tome un vistazo a Java Internacionalización FAQ . Si has puesto caracteres no ASCII en el archivo de .properties, debe convertirlo utilizando el native2ascii herramienta. Entonces todo debería funcionar.

El problema es que el archivo de propiedades de paquete de recursos está codificado en UTF-8, pero su aplicación se está cargando usando Latin-1.

Si se toma "Una latina minúscula con diéresis" (E4 en Latin-1 o 0000E4 como un punto de código Unicode) y representarla como UTF-8, se obtiene C3 A4. Si a continuación, tratar los Latin-1 como los bytes que se obtiene "Letra latina mayúscula A con tilde" y el "signo de moneda" cuadrado carácter ... que es cómo los personajes se está mostrando en su pantalla del botón !!

(Por cierto, aquí está un neologismo para el planchado de que se obtiene como resultado del uso de la codificación de caracteres mal ... mojibake . deflector tus amigos mediante su uso en la conversación.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top