J'ai besoin d'utiliser UTF-8 dans mes propriétés de ressource en utilisant Java ResourceBundle
. Lorsque j'entre le texte directement dans le fichier de propriétés, il s'affiche sous forme de mojibake.
Mon application s'exécute sur Google App Engine.
Quelqu'un peut-il me donner un exemple? Je ne peux pas obtenir ce travail.
java.util.ResourceBundle
, nonjava.util.Properties
.Réponses:
Les
ResourceBundle#getBundle()
utilisations sous les couverturesPropertyResourceBundle
lorsqu'un.properties
fichier est spécifié. Ceci à son tour utilise par défautProperties#load(InputStream)
pour charger ces fichiers de propriétés. Selon le javadoc , ils sont par défaut lus comme ISO-8859-1.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-8text_utf8.properties
en un fichier de propriétés codées ISO-8859-1 validetext.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-8InputStreamReader
, afin de pouvoir simplement les enregistrer au format UTF-8 sans avoir à vous encombrernative2ascii
. Voici un exemple de lancement:Cela peut être utilisé comme suit:
Voir également:
la source
StandardCharsets.UTF_8
si vous utilisez Java 7+Étant donné que vous disposez d'une instance de ResourceBundle et que vous pouvez obtenir String par:
J'ai résolu mon problème d'affichage japonais en:
la source
regardez ceci: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)
les propriétés acceptent un objet Reader comme arguments, que vous pouvez créer à partir d'un InputStream.
au moment de la création, vous pouvez spécifier l'encodage du Reader:
puis appliquez ce Reader à la méthode de chargement:
BTW: récupérez le flux depuis le fichier .properties :
BTW: obtenez un ensemble de ressources à partir de
InputStreamReader
:j'espère que cela peut vous aider!
la source
ResourceBundle
cependant.Properties
et que vous souhaitez récupérerUTF-8
String alors cela fonctionne comme un charme. Cependant, pour uneResourceBundle
ressource telle que la langue, la réponse acceptée est élégante. Néanmoins, up a voté la réponse.ResourceBundle rb = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"))
ResourceBundle.Control
avec UTF-8 et les nouvelles méthodes String ne fonctionnent pas, si le fichier de propriétés utilise le jeu de caractères cp1251, par exemple.J'ai donc recommandé d'utiliser une méthode commune: écrire en symboles unicode . Pour ça:
IDEA - dispose d'une option spéciale " Conversion native native vers ASCII transparente " (Paramètres> Encodage de fichier).
Eclipse - possède un plugin " Propriétés Editor " . Il peut fonctionner comme une application distincte.
la source
Ce problème a finalement été corrigé dans Java 9: https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9
Le codage par défaut des fichiers de propriétés est désormais UTF-8.
la source
Nous créons un fichier resources.utf8 qui contient les ressources en UTF-8 et avons une règle pour exécuter ce qui suit:
la source
native2ascii
? Je viens de le fairefind / -name native2ascii*
et je n'ai obtenu aucun résultat, donc je suppose que cela ne fait pas seulement partie du JDK ...jdk1.*.0_*/bin
.la source
Attention: les fichiers de propriétés java doivent être encodés en ISO 8859-1!
@see Properties Java Doc
Si vous voulez toujours vraiment le faire: jetez un œil à: Propriétés Java Encodage UTF-8 dans Eclipse - il y a quelques exemples de code
la source
http://sourceforge.net/projects/eclipse-rbe/
comme déjà indiqué, les fichiers de propriétés doivent être encodés en ISO 8859-1
Vous pouvez utiliser le plug-in ci-dessus pour Eclipse IDE pour effectuer la conversion Unicode pour vous.
la source
Voici une solution Java 7 qui utilise l'excellente bibliothèque de support de Guava et la construction try-with-resources. Il lit et écrit des fichiers de propriétés en utilisant UTF-8 pour l'expérience globale la plus simple.
Pour lire un fichier de propriétés au format UTF-8:
Pour écrire un fichier de propriétés au format UTF-8:
la source
Comme on l'a suggéré, je suis passé par l'implémentation du bundle de ressources .. mais cela n'a pas aidé .. car le bundle était toujours appelé sous les paramètres régionaux en_US ... j'ai essayé de définir mes paramètres régionaux par défaut dans une langue différente et toujours mon implémentation du bundle de ressources le contrôle était appelé avec en_US ... j'ai essayé de mettre des messages de journal et de faire une étape de débogage et de voir si un appel local différent était en cours après avoir changé les paramètres régionaux au moment de l'exécution via des appels xhtml et JSF ... cela ne s'est pas produit ... puis j'ai essayé de faire un système défini par défaut sur un utf8 pour lire les fichiers par mon serveur (serveur tomcat) .. mais cela a provoqué un pronlem car toutes mes bibliothèques de classes n'étaient pas compilées sous utf8 et tomcat a commencé à lire ensuite au format utf8 et le serveur ne fonctionnait pas correctement ... alors j'ai fini par implémenter une méthode dans mon contrôleur java pour être appelée à partir de fichiers xhtml ..dans cette méthode, j'ai fait ce qui suit:
J'étais particulièrement nerveux car cela pourrait ralentir les performances de mon application ... cependant, après avoir implémenté cela, il semble que mon application est plus rapide maintenant .. je pense que c'est parce que, j'accède maintenant directement aux propriétés au lieu de laisser JSF analyse son chemin dans l'accès aux propriétés ... je passe spécifiquement l'argument booléen dans cet appel parce que je sais que certaines propriétés ne seraient pas traduites et n'ont pas besoin d'être au format utf8 ...
Maintenant, j'ai enregistré mon fichier de propriétés au format UTF8 et cela fonctionne bien car chaque utilisateur de mon application a une préférence locale de référence.
la source
la source
Pour ce que ça vaut mon problème, c'est que les fichiers eux-mêmes étaient mal encodés. Utiliser iconv a fonctionné pour moi
la source
iconv
. Je n'en ai jamais entendu parler auparavant mais je l'ai tapé dans la console et voilà, c'est une chose qui existe (dans CentOS 6, en tout cas.)J'ai essayé d'utiliser l'approche fournie par Rod, mais en tenant compte de la préoccupation de BalusC de ne pas répéter la même solution de contournement dans toute l'application et je suis venu avec cette classe:
La façon d'utiliser cela serait très similaire à l'utilisation régulière de ResourceBundle:
Ou vous pouvez utiliser le constructeur alternatif qui utilise UTF-8 par défaut:
la source
Ouvrez la boîte de dialogue Paramètres / Préférences ( Ctrl+ Alt+ S), puis cliquez sur Éditeur et encodages de fichiers.
Ensuite, en bas, vous trouverez les encodages par défaut des fichiers de propriétés. Choisissez votre type d'encodage.
Vous pouvez également utiliser des symboles Unicode au lieu du texte dans votre ensemble de ressources (par exemple,
"ів"
égal\u0456\u0432
)la source
Depuis Java 9, le fichier de propriétés par défaut pour charger a été changé en UTF-8. https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm
la source