lire resourcebundle en UTF-8. Méthode getString() semble changer l'encodage ISO-8859
J'ai l'honorable cession de modifier le codage de notre espace de travail, les projets et les fichiers de l'encodage UTF-8. Nous avons plusieurs regroupements resourcebundle qui utilisé pour coder les caractères spéciaux unicode. Nous avons aussi voulu se débarrasser de l'unicode des trucs par passer à l'UTF-8, donc j'ai changé l'encodage des regroupements resourcebundle (.les propriétés) des fichiers trop et remplacé les caractères Unicode.
Nous avons aussi allemand regroupements resourcebundle et certains caractères comme
Ä, Ö, Ü, ß. ä, ö, ü et aussi les caractères spéciaux comme " ou "
ne sont pas affichés correctement dans le navigateur. Exemple:
Resourcebundleentry:
executeShellCommand.label = Shellkommando ausführen
Résultat dans le navigateur:
Les regroupements resourcebundle sont lus avec le Java.util.ResourceBundle.getString(String key) Méthode:
public String getLocalizedString(ResourceBundle bundle, String key) {
try {
System.out.println("getLocalizedString, key: " + key + ", resourcebundle: " + bundle.getString(key));
return bundle.getString(key);
} catch (MissingResourceException e) {
return key;
}
}
Si je vérifie le résultat de l'Sysout-je obtenir suivantes:
getLocalizedString, key: executeShellCommand.label, resourcebundle: Shellkommando ausführen
Il semble que la getString(clé) méthode modifie le codage des caractères lors de la lecture de de forfaits à la norme resourcbundleencoding(ISO-8859).
J'ai essayé de lutte contre ce problème:
public String getLocalizedString(ResourceBundle bundle, String key) {
try {
System.out.println("getLocalizedString, key: " + key + ", resourcebundle: " + new String (bundle.getString(key).getBytes(), "UTF-8"));
return new String (bundle.getString(key).getBytes(), "UTF-8");
} catch (MissingResourceException e) {
return key;
} catch (UnsupportedEncodingException e) {
return key;
}
}
Cela l'a aidé à récupérer la plupart des caractères spéciaux, mais il y a encore beaucoup d'entre eux qui ne sont pas affichés correctement:
J'ai aussi vérifié le contenu-type de configuration de l'Application web et de chaque demande unique qui obtient les regroupements de ressources tout est en utf-8.
Quelqu'un a une idée de comment empêcher la getString()-Méthode de modification de l'encodage ou est-il une meilleure façon de résoudre ce problème?
J'ai déjà pensé à elle en contrôlant les sorties. mais est-il un moyen de forcer la méthode getString à lire les caractères en UTF-8 et pas en ISO-8859?
Je pense que dans ton cas, le problème commence plus tôt lorsque vous instanciez le regroupement de ressources. Vous avez à lire à partir d'un flux dans la norme ISO-encodage; Java convertit en UTF-8 dans les chaînes, donc, la lecture de la chaîne de caractères en UTF-8 est correct. (Voir docs.oracle.com/javase/7/docs/api/java/util/...)
oui, c'est exactement ce que je veux faire. mais ni l'PropertiesResourcebundle ni la classe de Contrôle a une spécification de changer la lecture de format de codage. Est-il possible d'ouvrir l'ensemble codé en UTF-8`??
Charger le bundle avec un Contrôle personnalisé: stackoverflow.com/a/4660195/421245
OriginalL'auteur izocan | 2014-07-31
Vous devez vous connecter pour publier un commentaire.
Java regroupements resourcebundle assumer ISO-8859. Je pense que vous aurez besoin d'utiliser les Propriétés au lieu de ResourceBundle.
Je vois que PropertyResourceBundle a un constructeur qui prend un
java.io.Reader
. Im deviner que vous pourriez faire usage de.oui, j'ai enfin résolu de cette façon. le code suivant a résolu le problème: @Uwe Allner Merci à toi aussi.
java.io.InputStream applStream = getClass().getClassLoader().getResourceAsStream(applPath); Reader applReader = new InputStreamReader(applStream, "UTF-8"); applBundle = new PropertyResourceBundle(applReader);
Vous perdez le point de l'ensemble d'un bundle en le faisant de cette manière. La grande chose au sujet des faisceaux est que les biens dans le
language_country
fichier pouvez remplacer ceux de lacountry
fichier qui a également remplacer le fichier de base. Jetez un oeil à mon autre réponse. C'est un bon hack, mais je pense que vous auriez du garder le bundle comportement. Une autre option est d'enchaîner un peu PropertyResourceBundle ensemble d'instances (l'un pour la base, base_language et base_language_country). Voir ResourceBundle.setParent().vous êtes à ce point. - Je demander à la langue locale avant de me sélectionner une Ressource n'est donc pas un bon comportement. Ce n'est pas une manière élégante de résoudre le problème. - Je vérifier votre hack.
OriginalL'auteur lance-java
Comment est-ce pour un hack!!!
Où sont vos fichiers de propriété? Peut-être que l'utilisation
getClass().getClassLoader()
au lieu deThread.currentThread().getContextClassloader()
.OriginalL'auteur lance-java