50 votes

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

J'ai récemment dû changer l'encodage de la webapp sur laquelle je travaille de ISO-xx a utf8 . Tout s'est bien passé, sauf les fichiers de propriétés. J'ai ajouté -Dfile.encoding=UTF-8 sur eclipse.ini et les fichiers normaux fonctionnent bien. Cependant, les propriétés présentent un comportement étrange.

Si je copie utf8 à partir de Notepad++ et les coller dans Eclipse, elles s'affichent et fonctionnent bien. Lorsque je rouvre le fichier de propriétés, je vois certains caractères Unicode au lieu des caractères corrects, comme :

Zur\u00EF\u00BF\u00BDck instead of Zurück

mais l'application fonctionne toujours bien. Si je commence à modifier les propriétés, que j'ajoute des caractères spéciaux et que j'enregistre, ils s'affichent correctement, mais ils ne fonctionnent pas et tous les caractères spéciaux qui fonctionnaient auparavant ne fonctionnent plus.

Lorsque je compare la version locale avec CVS, je peux voir les caractères spéciaux correctement sur le fichier distant et après la mise à jour, je suis à nouveau au point de départ : l'application fonctionne, mais Eclipse affiche les caractères Unicode.

J'ai essayé de changer l'encodage du fichier en faisant un clic droit dessus et en sélectionnant "Autre" : UTF8" mais cela n'a rien donné. 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 m'en accommoder en modifiant les propriétés dans Notepad++ et en les collant dans Eclipse, mais je serais reconnaissant si quelqu'un pouvait m'aider à corriger ce problème dans Eclipse.

69voto

Jon Skeet Points 692016

La réponse pour "pré-Java-9" est ci-dessous. Depuis Java 9, les fichiers de propriétés sont enregistrés et chargés en UTF-8 par défaut, mais reviennent à ISO-8859-1 si une séquence d'octets UTF-8 invalide est détectée. Voir la page Notes de version de Java 9 pour les détails.


Les fichiers de propriétés sont ISO-8859-1 par définition - voir la documentation de l'option Propriétés classe.

Spring a un remplacement qui peut 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 les éléments suivants load y 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 passer à la commande load . Malheureusement FileReader toujours ne vous permet pas de spécifier l'encodage dans le constructeur (aargh) donc vous serez coincé avec l'enchaînement de FileInputStream y InputStreamReader ensemble. Mais ça va marcher.

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

5 votes

En Java 1.6, vous pouvez utiliser d'autres codages en utilisant les méthodes qui utilisent Reader/Writer au lieu de InputStream/OutputStream.

0 votes

Une solution plus générale que celle de la réponse acceptée, donc meilleure :)

0 votes

@JonSkeet Je travaille sur ce problème depuis des semaines. Merci beaucoup !

54voto

baybora.oren Points 1385

Ne gaspillez pas votre temps, vous pouvez utiliser Plugin Resource Bundle sur Eclipse

Basic Screen Shot

Ancienne page Sourceforge

3 votes

C'est un plugin très utile, merci pour le conseil ! C'est dommage qu'il n'y ait pas d'URL d'installation, mais il suffit de le déposer dans le dossier des plugins pour que ça marche.

3 votes

Est-ce que l'outil native2ascii est utilisé en interne pour les caractères non unicodes ou dois-je échapper manuellement les symboles unicodes ?

0 votes

@baybora.oren : J'ai développé le .zip dans le plugin du dossier eclipse, mais je ne vois pas de changement dans l'ide (j'ai arrêté et redémarré eclipse). Un indice ?

12voto

Mario Ortegón Points 8563

Ce n'est pas un problème avec Eclipse. Si vous utilisez la classe Properties pour lire et stocker le fichier de propriétés, la classe échappera à tous les caractères spéciaux.

Extrait de la documentation de la classe :

Lors de l'enregistrement des propriétés dans un flux ou de leur chargement depuis un flux, le codage des caractères ISO 8859-1 est utilisé. Pour les caractères qui ne peuvent pas être représentés directement dans ce codage, des échappatoires Unicode sont utilisés ; toutefois, un seul caractère 'u' est autorisé dans une séquence d'échappatoire. L'outil native2ascii peut être utilisé pour convertir les fichiers de propriétés vers et depuis d'autres codages de caractères.

À partir de l'API, méthode store() :

Caractères inférieurs à \u0020 et les caractères supérieurs à \u007E s'écrivent comme suit \uxxxx pour la valeur hexadécimale appropriée xxxx.

4 votes

NetBeans affiche joliment les fichiers de propriétés qui ont \uXXXX et vous permet de les éditer avec les caractères UTF correctement affichés. Pourquoi Eclipse ne le fait-il pas ? A mon avis, ceci est un problème avec Eclipse.

0 votes

+1 : le quantum de réconfort pour avoir été skeetés.

11voto

Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
Fonctionne comme un charme

-)

0 votes

Malheureusement, props.load, dans la version 1.6, requiert un InputStream et indique spécifiquement qu'il s'attend à la bonne vieille méthode ISO-8859-1.

4voto

Alan Moore Points 39365

Il y a trop de points dans le processus que vous décrivez où des erreurs peuvent se produire, donc je ne vais pas essayer de deviner ce que vous faites mal, mais je pense savoir 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 malformée. Il semble que votre texte soit sauvegardé en ISO-8859-1, puis lu comme s'il était en UTF-8, puis sauvegardé en UTF-8, puis converti au format Propriétés à l'aide de la fonction native2ascii en utilisant l'encodage par défaut de la plate-forme (par exemple, Windows-1252).

ü              => 0xFC                // save as ISO-8859-1
0xFC           => U+FFFD              // read as UTF-8
U+FFFD         => 0xEF 0xBF 0xBD      // save as UTF-8
0xEF 0xBF 0xBD => \\u00EF\\u00BF\\u00BD  // native2ascii

Je vous suggère de ne pas toucher à la propriété "file.encoding". Comme "file.separator" et "line.separator", elle est loin d'être aussi utile que vous pourriez l'espérer. Prenez plutôt l'habitude de toujours spécifier un encodage lorsque vous lisez et écrivez des fichiers texte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X