Lesen resourcebundle als UTF-8. getString () - Methode zu ändern scheint-encoding ISO-8859 -
Habe ich die ehrenvolle Zuordnung zum ändern der Codierung unserer kompletten workspace, Projekte und Dateien, die UTF-8-Codierung. Wir haben verschiedene Resourcebundles, die verwendet werden, um code Sonderzeichen mit unicode. Wir wollte auch, um loszuwerden, das unicode Zeug durch die Umstellung auf UTF-8 umgestellt damit ich die Codierung des Resourcebundles (.Eigenschaften) - Dateien zu und ersetzt die Unicode-Zeichen.
Wir haben auch Deutsche resourcebundles und einige chars wie
Ä, Ö, Ü, ß. ä, ö, ü und auch Sonderzeichen wie „ oder “
werden nicht korrekt angezeigt im browser. Beispiel:
Resourcebundleentry:
executeShellCommand.label = Shellkommando ausführen
Ergebnis im browser:
Den resourcebundles sind, Lesen Sie die mit dem Java.util.ResourceBundle.getString(String key) Methode:
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;
}
}
Wenn ich überprüfen Sie die Ausgabe des obigen Sysout bekomme ich Folgendes:
getLocalizedString, key: executeShellCommand.label, resourcebundle: Shellkommando ausführen
Scheint es, dass die getString(key) - Methode ändert die Kodierung der chars beim Lesen Sie aus den bündeln, um die standard-resourcbundleencoding(ISO-8859).
Ich habe versucht, gegen dieses Problem:
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;
}
}
Dies hat geholfen, sich zu erholen, die meisten Sonderzeichen sein, aber es gibt immer noch viele von Ihnen, die nicht korrekt angezeigt:
Ich habe auch überprüft der content-type-Konfiguration der WebApp und jeder einzelne Antrag, der bekommt die Ressource bundles ist alles utf-8.
Hat jemand eine Idee, wie verhindern, dass die getString()-Methode aus der änderung der Kodierung oder gibt es einen besseren Weg, um dieses Problem zu lösen?
- Wenn Ihr resourcebundles abgelegt werden in properties-Dateien: Java geht standardmäßig davon aus, dass Sie kodiert in ISO-8859.
- Ich habe bereits herausgefunden durch die Kontrolle der Ausgänge. aber gibt es eine Möglichkeit zu zwingen, die getString-Methode zu Lesen, die Zeichen als UTF-8 und nicht ISO-8859 -?
- Ich denke, in Ihrem Fall das problem beginnt früher, wo Sie instanziieren das Ressourcen-bundle. Sie Lesen aus einem stream in ISO-Codierung, Java wandelt das UTF-8-strings, so liest den string als UTF-8 korrekt ist. (Siehe docs.oracle.com/javase/7/docs/api/java/util/...)
- ja genau das ist, was ich tun will. aber weder die PropertiesResourcebundle noch die Control-Klasse hat jegliche Spezifikation zu ändern Lesung-encoding-format. Gibt es eine Möglichkeit, öffnen Sie das Paket als UTF-8 codiert`??
- Laden Sie das Paket mit einem custom Control: stackoverflow.com/a/4660195/421245
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java ResourceBundles davon ausgehen ISO-8859. Ich denke, Sie müssen mithilfe von Eigenschaften anstelle von ResourceBundle.
java.io.Reader
. Ich vermute, Sie könnten machen.java.io.InputStream applStream = getClass().getClassLoader().getResourceAsStream(applPath); Reader applReader = new InputStreamReader(applStream, "UTF-8"); applBundle = new PropertyResourceBundle(applReader);
language_country
Datei überschreiben können diese in dercountry
- Datei, die auch außer Kraft setzen, die base Datei. Werfen Sie einen Blick auf meine andere Antwort. Es ist ein richtiger hack, aber ich denke, Sie hatten das bundle Verhalten. Eine weitere option ist die Kette ein paar PropertyResourceBundle-Instanzen (eine für die Basis, base_language und base_language_country). Sehen ResourceBundle.setParent().Wie ist das für ein hack!!!
getClass().getClassLoader()
stattThread.currentThread().getContextClassloader()
.