Java 9 et plus récent
À partir de Java 9, les fichiers de propriétés sont encodés en UTF-8 par défaut, et l'utilisation de caractères en dehors de l'ISO-8859-1 devrait fonctionner sans problème.
Si vous utilisez un IDE pour les éditer, alors vous devrez peut-être renseigner l'IDE pour les lire en utilisant UTF-8. Voici comment faire dans les paramètres de IntelliJ :
![entrer la description de l'image ici]()
Et dans les préférences d'Eclipse :
![entrer la description de l'image ici]()
Java 8 et plus ancien
Le ResourceBundle#getBundle()
utilise en interne PropertyResourceBundle
lorsqu'un fichier .properties
est spécifié. Celui-ci utilise par défaut Properties#load(InputStream)
pour charger ces fichiers de propriétés. Selon la javadoc, ils sont lus par défaut en tant qu'ISO-8859-1.
public void load(InputStream inStream) throws IOException
Lit une liste de propriétés (paires de clé et d'élément) à partir du flux d'octets d'entrée. Le flux d'entrée est dans un format simple orienté ligne tel que spécifié dans load(Reader) et est supposé utiliser l'encodage de caractères ISO 8859-1 ; c'est-à-dire que chaque octet correspond à un caractère Latin1. Les caractères qui ne sont pas en Latin1, ainsi que certains caractères spéciaux, sont représentés dans les clés et les éléments en utilisant des échappements Unicode tels que définis dans la section 3.3 de la spécification du langage Java™.
Ainsi, vous devriez les sauvegarder en tant qu'ISO-8859-1. Si vous avez des caractères au-delà de la plage ISO-8859-1 et que vous ne pouvez pas utiliser \uXXXX
de mémoire et êtes donc obligé de sauvegarder le fichier en UTF-8, alors vous devrez utiliser l'outil native2ascii pour convertir un fichier de propriétés enregistré en UTF-8 en un fichier de propriétés enregistré en ISO-8859-1 où tous les caractères non couverts sont convertis en format \uXXXX
. L'exemple ci-dessous convertit un fichier de propriétés encodé en UTF-8 text_utf8.properties
en un fichier de propriétés valide encodé en ISO-8859-1 text.properties
.
native2ascii -encoding UTF-8 text\_utf8.properties text.properties
Lorsque vous utilisez un IDE tel qu'Eclipse ou IntelliJ, cela est déjà automatiquement fait lorsque vous créez un fichier .properties
dans un projet basé sur Java et utilisez l'éditeur de fichiers de propriétés intégré à l'IDE. Il convertira de manière transparente les caractères au-delà de la plage ISO-8859-1 en format \uXXXX
. Voir aussi les captures d'écran ci-dessous d'Eclipse (remarquez les onglets "Propriétés" et "Source" en bas, cliquez pour agrandir) :
![]()
Alternativement, vous pouvez également créer une implémentation personnalisée de ResourceBundle.Control
dans laquelle vous lisez explicitement les fichiers de propriétés en UTF-8 à l'aide de InputStreamReader
, afin de pouvoir les sauvegarder simplement en UTF-8 sans avoir à vous embêter avec native2ascii
. Voici un exemple de démarrage :
public class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
// La ligne ci-dessous est modifiée pour lire les fichiers de propriétés en UTF-8.
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 {
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 aussi :
1 votes
Java 1.6 a corrigé cela car vous pouvez passer un Reader. Voir la réponse de @Chinaxing plus bas.
1 votes
@Will : la question concerne principalement leur lecture via
java.util.ResourceBundle
, et nonjava.util.Properties
.1 votes
Vérifiez cette question répondue,,, j'espère que cela vous aidera [stackoverflow.com/questions/863838/… [1]: stackoverflow.com/questions/863838/…
7 votes
JDK9 devrait prendre en charge nativement UTF-8, voir JEP 226