web-dev-qa-db-fra.com

Java propriétés encodage UTF-8 dans Eclipse

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.

48
GvS

Ne perdez pas votre temps, vous pouvez utiliser Plugin Resource Bundle in Eclipse

Basic Screen Shot

Ancienne page Sourceforge

54
baybora.oren

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();
}
64
Jon Skeet

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.

12
Mario Ortegón
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));

Fonctionne comme un charme

:-)

10
Joaquim Cardeira

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.

4
Alan Moore

Il existe un moyen beaucoup plus simple:

props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));
4
David Constantine
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.

4
Hirantha

Juste un autre plugin Eclipse pour les fichiers * .properties:

Éditeur de propriétés

3
btpka3

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");
2
gopeca

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?

1
user185811

Je vous recommande d'utiliser Attesoro ( http://attesoro.org/ ). Est simple et facile à utiliser. Et est fabriqué en Java.

1
htobon