Ich muss UTF-8 in meinen Ressourceneigenschaften mit Java verwenden ResourceBundle
. Wenn ich den Text direkt in die Eigenschaftendatei eingebe, wird er als Mojibake angezeigt.
Meine App läuft auf Google App Engine.
Kann mir jemand ein Beispiel geben? Ich kann diese Arbeit nicht bekommen.
java.util.ResourceBundle
, nicht überjava.util.Properties
.Antworten:
Die
ResourceBundle#getBundle()
Verwendung unter dem Deckmantel,PropertyResourceBundle
wenn eine.properties
Datei angegeben wird. Dies wiederum verwendet standardmäßigProperties#load(InputStream)
diese Eigenschaftendateien. Gemäß der javadoc , sind sie standardmäßig Lese- als ISO-8859-1.Sie müssen sie also als ISO-8859-1 speichern. Wenn Sie Zeichen außerhalb des ISO-8859-1-Bereichs haben und diese nicht ohne
\uXXXX
Kopf verwenden können und daher gezwungen sind, die Datei als UTF-8 zu speichern, müssen Sie das native2ascii- Tool verwenden, um eine zu konvertieren UTF-8-gespeicherte Eigenschaftendatei in eine nach ISO-8859-1 gespeicherte Eigenschaftendatei, in der alle nicht abgedeckten Zeichen in das\uXXXX
Format konvertiert werden. Im folgenden Beispiel wird eine UTF-8-codierte Eigenschaftendateitext_utf8.properties
in eine gültige ISO-8859-1-codierte Eigenschaftendatei konvertierttext.properties
.Wenn Sie eine vernünftige IDE wie Eclipse verwenden, erfolgt dies bereits automatisch, wenn Sie eine
.properties
Datei in einem Java-basierten Projekt erstellen und den Eclipse-eigenen Editor verwenden. Eclipse konvertiert die Zeichen über den ISO-8859-1-Bereich hinaus transparent in das\uXXXX
Format. Siehe auch die folgenden Screenshots (beachten Sie die Registerkarten "Eigenschaften" und "Quelle" unten, klicken Sie für eine große Auswahl):Alternativ können Sie auch eine benutzerdefinierte
ResourceBundle.Control
Implementierung erstellen , bei der Sie die Eigenschaftendateien explizit als UTF-8 mit lesenInputStreamReader
, sodass Sie sie einfach als UTF-8 speichern können, ohne sich damit herumschlagen zu müssennative2ascii
. Hier ist ein Kickoff-Beispiel:Dies kann wie folgt verwendet werden:
Siehe auch:
quelle
StandardCharsets.UTF_8
Zögern Sie nicht zu verwenden, wenn Sie Java 7+Vorausgesetzt, Sie haben eine Instanz von ResourceBundle und können String abrufen durch:
Ich habe mein japanisches Anzeigeproblem gelöst durch:
quelle
Schauen Sie sich das an: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)
Die Eigenschaften akzeptieren ein Reader- Objekt als Argumente, die Sie aus einem InputStream erstellen können.
Zum Zeitpunkt der Erstellung können Sie die Codierung des Readers angeben:
Wenden Sie dann diesen Reader auf die Lademethode an:
Übrigens : Holen Sie sich den Stream aus der .properties- Datei:
Übrigens: Holen Sie sich das Ressourcenpaket von
InputStreamReader
:hoffe das kann dir helfen!
quelle
ResourceBundle
jedoch.Properties
undUTF-8
String abrufen möchten, dann funktioniert dies wie ein Zauber. FürResourceBundle
solche Sprachressourcen ist die akzeptierte Antwort jedoch elegant. Trotzdem stimmte die Antwort ab.ResourceBundle rb = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"))
ResourceBundle.Control
mit UTF-8 und neuen String-Methoden funktionieren nicht, wenn die Eigenschaftendatei beispielsweise den Zeichensatz cp1251 verwendet.Daher empfahl ich die Verwendung einer gängigen Methode: Schreiben Sie in Unicode- Symbole. Dafür:
IDEA - verfügt über eine spezielle Option " Transparente Konvertierung von Native in ASCII " (Einstellungen> Dateicodierung).
Eclipse - hat ein Plugin " Properties Editor " . Es kann als separate Anwendung arbeiten.
quelle
Dieses Problem wurde endlich in Java 9 behoben: https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9
Die Standardcodierung für Eigenschaftendateien ist jetzt UTF-8.
quelle
Wir erstellen eine Datei resources.utf8, die die Ressourcen in UTF-8 enthält, und haben eine Regel, um Folgendes auszuführen:
quelle
native2ascii
? Ich habe es gerade getanfind / -name native2ascii*
und keine Ergebnisse erzielt, daherjdk1.*.0_*/bin
.quelle
Achtung: Java-Eigenschaftendateien sollten in ISO 8859-1 codiert sein!
@see Eigenschaften Java Doc
Wenn Sie dies dennoch wirklich tun möchten: Schauen Sie sich Folgendes an: Java-Eigenschaften UTF-8-Codierung in Eclipse - es gibt einige Codebeispiele
quelle
http://sourceforge.net/projects/eclipse-rbe/
Wie bereits erwähnt, sollten Eigenschaftendateien in ISO 8859-1 codiert werden
Sie können das obige Plugin für die Eclipse-IDE verwenden, um die Unicode-Konvertierung für Sie durchzuführen.
quelle
Hier ist eine Java 7-Lösung, die die hervorragende Support-Bibliothek von Guava und das Konstrukt "Try-with-Resources" verwendet. Es liest und schreibt Eigenschaftendateien mit UTF-8 für die einfachste Gesamterfahrung.
So lesen Sie eine Eigenschaftendatei als UTF-8:
So schreiben Sie eine Eigenschaftendatei als UTF-8:
quelle
Wie bereits erwähnt, habe ich die Implementierung des Ressourcenpakets durchlaufen. Dies hat jedoch nicht geholfen. Da das Paket immer unter dem Gebietsschema en_US aufgerufen wurde, habe ich versucht, mein Standardgebietsschema auf eine andere Sprache festzulegen und trotzdem das Ressourcenpaket zu implementieren Die Steuerung wurde mit en_US aufgerufen ... Ich habe versucht, Protokollnachrichten zu platzieren und einen Schritt durch das Debugging zu machen, um zu sehen, ob ein anderer lokaler Anruf getätigt wurde, nachdem ich das Gebietsschema zur Laufzeit durch xhtml- und JSF-Aufrufe geändert habe ... das ist nicht passiert ... dann habe ich versucht, ein System festzulegen, das standardmäßig auf utf8 gesetzt ist, um Dateien von meinem Server (Tomcat-Server) zu lesen. Dies verursachte jedoch ein Problem, da alle meine Klassenbibliotheken nicht unter utf8 kompiliert wurden und Tomcat dann im utf8-Format zu lesen begann und der Server lief nicht richtig ... dann implementierte ich eine Methode in meinem Java-Controller, die aus XML-Dateien aufgerufen werden sollte.Bei dieser Methode habe ich Folgendes getan:
Ich war besonders nervös, da dies die Leistung meiner Anwendung verlangsamen könnte. Nach der Implementierung sieht es jedoch so aus, als ob meine Anwendung jetzt schneller ist. Ich denke, das liegt daran, dass ich jetzt direkt auf die Eigenschaften zugreife, anstatt sie zuzulassen JSF analysiert seinen Weg in den Zugriff auf Eigenschaften ... Ich übergebe in diesem Aufruf speziell das Boolesche Argument, da ich weiß, dass einige der Eigenschaften nicht übersetzt werden und nicht im utf8-Format vorliegen müssen ...
Jetzt habe ich meine Eigenschaftendatei im UTF8-Format gespeichert und sie funktioniert einwandfrei, da jeder Benutzer in meiner Anwendung eine bevorzugte Ländereinstellung hat.
quelle
quelle
Mein Problem war, dass die Dateien selbst in der falschen Codierung waren. Die Verwendung von iconv hat bei mir funktioniert
quelle
iconv
. Ich habe noch nie davon gehört, aber ich habe es in die Konsole eingegeben und siehe da, es ist eine Sache, die es gibt (jedenfalls in CentOS 6).Ich habe versucht, den von Rod bereitgestellten Ansatz zu verwenden, aber unter Berücksichtigung der Bedenken von BalusC, nicht in allen Anwendungen dieselbe Umgehung zu wiederholen, und bin mit dieser Klasse gekommen:
Die Verwendung wäre sehr ähnlich wie bei der regulären Verwendung von ResourceBundle:
Oder Sie können den alternativen Konstruktor verwenden, der standardmäßig UTF-8 verwendet:
quelle
Öffnen Sie das Dialogfeld Einstellungen / Einstellungen ( Ctrl+ Alt+ S) und klicken Sie dann auf Editor und Dateikodierungen.
Unten sehen Sie dann die Standardcodierungen für Eigenschaftendateien. Wählen Sie Ihren Codierungstyp.
Alternativ können Sie Unicode-Symbole anstelle von Text in Ihrem Ressourcenpaket verwenden (z. B.
"ів"
gleich\u0456\u0432
).quelle
Von Java 9 wurde die Standardeinstellung zum Laden der Eigenschaftendatei in UTF-8 geändert. https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm
quelle