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:
alt text

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:
alt text

War es hilfreich?

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.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top