Warum ist Text auf Schwedisch aus einem Ressourcenbündel zeigt, wie Kauderwelsch up? [Duplikat]
-
09-10-2019 - |
Frage
Mögliche Duplizieren:
Wie UTF-8 verwenden, in Ressourceneigenschaften mit Resource
Ich möchte Internationalisierung meiner Java Swing-Anwendung ermöglichen. Ich benutze eine Bundle-Datei alle Etiketten im Inneren zu halten.
Als Test habe ich versucht, ein schwedischer Titel zu einem JButton
einzustellen. So in der Bundle-Datei schrieb ich:
nextStepButton=nästa
Und in dem Java-Code, den ich schrieb:
nextStepButton.setText(bundle.getString("nextStepButton"));
Aber die Titelzeichen der Taste erscheinen falsch zur Laufzeit:
Ich bin mit dem Schriftart Tahoma, die Unicode unterstützt. Wenn ich auf die Schaltfläche Titel manuell durch Satz erscheint es in Ordnung:
nextStepButton.setText("nästa");
Jede Idee, warum es in Bundle-Datei fehlschlägt?
--------------------------------------------> Edit: Encoding den Titel:
Ich habe versucht, aus der Bundle-Datei den Text codiert, kommt mit dem Code:
nextStepButton.setText(new String(bundle.getString("nextStepButton").getBytes("UTF-8")));
Und noch ist das Ergebnis:
Lösung
Gemäß den javadoc , Eigenschaften Dateien werden gelesen mit ISO-8859-1.
.. der Eingangs- / Ausgangsstrom wird in ISO 8859-1 Zeichencodierung codiert. Zeichen, die in dieser Codierung kann nicht direkt dargestellt werden kann geschrieben werden Unicode Fluchten verwendet; nur ein einziges ‚u‘ Zeichen wird in einer Escape-Sequenz erlaubt. Das native2ascii Tool kann zu und von anderen Zeichenkodierungen zu konvertieren Eigenschaftsdateien verwendet werden.
Neben der Verwendung des native2ascii Tool zum Konvertieren von UTF-8-Properties-Dateien auf ISO-8859-1 Eigenschaften Dateien können Sie auch eine benutzerdefinierte ResourceBundle.Control
, so dass Sie das Laden der Eigenschaften von Dateien und die Verwendung von UTF-8 steuern können dort. Hier ist ein Kick-off-Beispiel:
public class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
// The below is a copy of the default implementation.
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
// Only this line is changed to make it to read properties files as UTF-8.
bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
} finally {
stream.close();
}
}
return bundle;
}
}
Verwenden Sie es wie folgt:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Auf diese Weise können mit native2ascii Tool Ärger nicht brauchen und Ihnen einen besseren wartbar Eigenschaften Dateien enden.
Siehe auch:
Andere Tipps
Hier finden Sie aktuelle Java Internationalisierung FAQ . Wenn Sie nicht ASCII-Zeichen in Ihrem .properties
Datei gesetzt haben, müssen Sie wandeln es die native2ascii Werkzeug. Dann sollte alles funktionieren.
Das Problem ist, dass die Ressourcenbündel Eigenschaften Datei in UTF-8 kodiert ist, aber Ihre Anwendung wird geladen es mit Latin-1.
Wenn Sie "LATIN SMALL A mit Trema" (E4 in Latin-1 oder 0000E4 als Unicode-Codepoint) nehmen und stellen es als UTF-8, erhalten Sie C3 A4. Wenn Sie dann behandeln diejenigen, die als Latin-1 Bytes Sie „LATIN CAPITAL LETTER A MIT TILDE“ und der Platz „Währungssymbol“ Charakter ... bekommen, das ist, wie die Charaktere in Ihrem Screenshot der Taste !!
zeigen(Übrigens, hier ist ein Neologismus für die Mangeln Sie als Ergebnis erhalten die falsche Zeichencodierung mit ... Mojibake . Ihre Freunde Lautsprecherbox, indem sie es im Gespräch mit.)