Les ResourceBundle#getBundle()
utilisations sous les couvertures PropertyResourceBundle
lorsqu'un .properties
fichier est spécifié. Ceci à son tour utilise par défaut Properties#load(InputStream)
pour charger ces fichiers de propriétés. Selon le javadoc , ils sont par défaut lus comme ISO-8859-1.
public void load(InputStream inStream) throws IOException
Lit une liste de propriétés (paires de clés et d'éléments) dans le flux d'octets d'entrée. Le flux d'entrée est dans un format simple orienté ligne comme spécifié dans la charge (Reader) et est supposé utiliser le codage de caractères ISO 8859-1 ; c'est-à-dire que chaque octet est un caractère Latin1. Les caractères qui ne sont pas en Latin1 et certains caractères spéciaux sont représentés dans des clés et des éléments utilisant des échappements Unicode comme défini dans la section 3.3 de la spécification du langage Java ™.
Vous devez donc les enregistrer au format ISO-8859-1. Si vous avez des caractères au-delà de la plage ISO-8859-1 et que vous ne pouvez pas les utiliser \uXXXX
de haut en bas et que vous êtes donc obligé d'enregistrer le fichier au format UTF-8, vous devrez utiliser l' outil native2ascii pour convertir un Fichier de propriétés enregistrées UTF-8 dans un fichier de propriétés enregistrées ISO-8859-1 dans lequel tous les caractères découverts sont convertis au \uXXXX
format. L'exemple ci-dessous convertit un fichier de propriétés codées UTF-8 text_utf8.properties
en un fichier de propriétés codées ISO-8859-1 valide text.properties
.
native2ascii -encoding UTF-8 text_utf8.properties text.properties
Lorsque vous utilisez un IDE sain comme Eclipse, cela se fait déjà automatiquement lorsque vous créez un .properties
fichier dans un projet basé sur Java et utilisez le propre éditeur d'Eclipse. Eclipse convertira de manière transparente les caractères au-delà de la plage ISO-8859-1 au \uXXXX
format. Voir également les captures d'écran ci-dessous (notez les onglets "Propriétés" et "Source" en bas, cliquez pour agrandir):
Alternativement, vous pouvez également créer une ResourceBundle.Control
implémentation personnalisée dans laquelle vous lisez explicitement les fichiers de propriétés au format UTF-8 InputStreamReader
, afin de pouvoir simplement les enregistrer au format UTF-8 sans avoir à vous encombrer native2ascii
. Voici un exemple de lancement:
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;
}
}
Cela peut être utilisé comme suit:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Voir également: