Los ResourceBundle#getBundle()
usos debajo de las cubiertas PropertyResourceBundle
cuando .properties
se especifica un archivo. Esto a su vez usa de forma predeterminada Properties#load(InputStream)
para cargar esos archivos de propiedades. Según el javadoc , se leen por defecto como ISO-8859-1.
public void load(InputStream inStream) throws IOException
Lee una lista de propiedades (pares de claves y elementos) de la secuencia de bytes de entrada. El flujo de entrada está en un formato simple orientado a línea como se especifica en load (Reader) y se supone que usa la codificación de caracteres ISO 8859-1 ; es decir, cada byte es un carácter latino1. Los caracteres que no están en latín1, y ciertos caracteres especiales, se representan en claves y elementos utilizando escapes Unicode como se define en la sección 3.3 de La especificación del lenguaje Java ™.
Por lo tanto, deberá guardarlos como ISO-8859-1. Si tiene caracteres más allá del rango ISO-8859-1 y no puede usar \uXXXX
la parte superior de la cabeza y, por lo tanto, se ve obligado a guardar el archivo como UTF-8, entonces necesitará usar la herramienta native2ascii para convertir un El archivo de propiedades guardadas UTF-8 en un archivo de propiedades guardadas ISO-8859-1 en el que todos los caracteres descubiertos se convierten en \uXXXX
formato. El siguiente ejemplo convierte un archivo de propiedades codificado UTF-8 text_utf8.properties
en un archivo de propiedades codificado ISO-8859-1 válido text.properties
.
native2ascii -coding UTF-8 text_utf8.properties text.properties
Cuando se usa un IDE sano como Eclipse, esto ya se hace automáticamente cuando se crea un .properties
archivo en un proyecto basado en Java y se usa el propio editor de Eclipse. Eclipse convertirá de forma transparente los caracteres más allá del rango ISO-8859-1 al \uXXXX
formato. Vea también las capturas de pantalla a continuación (observe las pestañas "Propiedades" y "Fuente" en la parte inferior, haga clic para ampliar):
Alternativamente, también puede crear una ResourceBundle.Control
implementación personalizada en la que lea explícitamente los archivos de propiedades como UTF-8 InputStreamReader
, de modo que pueda guardarlos como UTF-8 sin la necesidad de molestarse native2ascii
. Aquí hay un ejemplo inicial:
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;
}
}
Esto se puede usar de la siguiente manera:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Ver también: