J'ai récemment dû changer l'encodage de l'application Web sur laquelle je travaille à partir de ISO-xx
à utf8
. Tout s'est bien passé, sauf les fichiers de propriétés. J'ai ajouté -Dfile.encoding=UTF-8
dans Eclipse.ini
et les fichiers normaux fonctionnent bien. Les propriétés montrent cependant un comportement étrange.
Si je copie utf8
propriétés codées de Notepad ++ et collez-les dans Eclipse, elles s'affichent et fonctionnent correctement. Lorsque je rouvre le fichier de propriétés, je vois des caractères Unicode au lieu de caractères appropriés, comme:
Zur\u00EF\u00BF\u00BDck instead of Zurück
mais l'application fonctionne toujours bien. Si je commence à modifier les propriétés, ajouter des caractères spéciaux et enregistrer, ils s'affichent correctement, mais ils ne fonctionnent pas et tous les caractères spéciaux fonctionnant précédemment ne fonctionnent plus.
Lorsque je compare la version locale avec CVS, je peux voir correctement les caractères spéciaux sur le fichier distant et après la mise à jour, je recommence: l'application fonctionne, mais Eclipse affiche les caractères Unicode.
J'ai essayé de changer l'encodage des fichiers en faisant un clic droit dessus et en sélectionnant "Autre: UTF8" mais cela n'a pas aidé. Il a également dit: "déterminé à partir du contenu: ISO-8859-1"
J'utilise Java 6 et Jboss Developer basé sur Eclipse 3.3
Je peux vivre avec en modifiant les propriétés dans Notepad ++ et en les collant dans Eclipse, mais je serais reconnaissant si quelqu'un pouvait m'aider à résoudre ce problème dans Eclipse.
Ne perdez pas votre temps, vous pouvez utiliser Plugin Resource Bundle in Eclipse
Les fichiers de propriétés sont ISO-8859-1 par définition - voir la documentation de la classe Properties .
Spring a un remplacement qui peut se charger avec un encodage spécifié, en utilisant PropertiesFactoryBean
.
EDIT: Comme Laurence l'a noté dans les commentaires, Java 1.6 a introduit des surcharges pour load
et store
qui prennent un Reader
/Writer
. Cela signifie que vous pouvez créer un lecteur pour le fichier avec l'encodage de votre choix et le transmettre à load
. Malheureusement FileReader
toujours ne vous permet pas de spécifier l'encodage dans le constructeur (aargh) donc vous serez coincé avec le chaînage FileInputStream
et InputStreamReader
ensemble. Cependant, cela fonctionnera.
Par exemple, pour lire un fichier en utilisant 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();
}
Ce n'est pas un problème avec Eclipse. Si vous utilisez la classe Propriétés pour lire et stocker le fichier de propriétés, la classe échappera à tous les caractères spéciaux.
De la documentation de la classe:
Lors de l'enregistrement de propriétés dans un flux ou de leur chargement à partir d'un flux, le codage de caractères ISO 8859-1 est utilisé. Pour les caractères qui ne peuvent pas être directement représentés dans cet encodage, les échappements Unicode sont utilisés; cependant, un seul caractère "u" est autorisé dans une séquence d'échappement. L'outil native2ascii peut être utilisé pour convertir des fichiers de propriétés vers et depuis d'autres encodages de caractères.
A partir de l'API, méthode store ():
Les caractères inférieurs à\u0020 et supérieurs à\u007E sont écrits sous la forme\uxxxx pour la valeur hexadécimale appropriée xxxx.
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
Fonctionne comme un charme
:-)
Il y a trop de points dans le processus que vous décrivez où des erreurs peuvent se produire, donc je n'essaierai pas de deviner ce que vous faites mal, mais je pense que je sais ce qui se passe sous le capot.
EF BF BD
est la forme codée UTF-8 de U+FFFD
, le caractère de remplacement standard qui est inséré par les décodeurs lorsqu'ils rencontrent une entrée mal formée. Il semble que votre texte soit enregistré au format ISO-8859-1, puis lu comme s'il s'agissait d'UTF-8, puis enregistré au format UTF-8, puis converti au format Propriétés à l'aide de native2ascii
en utilisant l'encodage par défaut de la plateforme (par exemple, windows-1252).
ü => 0xFC // enregistrer en ISO-8859-1 0xFC => U + FFFD // lire en UTF-8 U + FFFD => 0xEF 0xBF 0xBD // enregistrer en UTF- 8 0xEF 0xBF 0xBD =>\u00EF\u00BF\u00BD // native2ascii
Je vous suggère de laisser la propriété "file.encoding" seule. Comme "file.separator" et "line.separator", il n'est pas aussi utile que vous vous en doutez. Au lieu de cela, prenez l'habitude de toujours spécifier un encodage lors de la lecture et de l'écriture de fichiers texte.
Il existe un moyen beaucoup plus simple:
props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
cela fonctionne bien dans Java 1.6. Comment puis-je faire cela dans 1.5, puisque la classe Properties n'a pas de méthode pour analyser InputStreamReader
.
Juste un autre plugin Eclipse pour les fichiers * .properties:
Vous pouvez définir des fichiers .properties UTF-8 pour stocker vos traductions et utiliser ResourceBundle pour obtenir des valeurs. Pour éviter les problèmes, vous pouvez modifier le codage:
String value = RESOURCE_BUNDLE.getString(key);
return new String(value.getBytes("ISO-8859-1"), "UTF-8");
Cela semble fonctionner uniquement pour certains caractères ... y compris les caractères spéciaux pour l'allemand, le portugais et le français. Cependant, j'ai rencontré des problèmes avec les caractères russes, hindi et mandarin. Celles-ci ne sont pas converties au format Propriétés "native2ascii", au lieu d'être enregistrées avec ?? ?? ??
. Aucun conseil?
Je vous recommande d'utiliser Attesoro ( http://attesoro.org/ ). Est simple et facile à utiliser. Et est fabriqué en Java.