Die ResourceBundle#getBundle()
Verwendung unter dem Deckmantel, PropertyResourceBundle
wenn eine .properties
Datei angegeben wird. Dies wiederum verwendet standardmäßig Properties#load(InputStream)
diese Eigenschaftendateien. Gemäß der javadoc , sind sie standardmäßig Lese- als ISO-8859-1.
public void load(InputStream inStream) throws IOException
Liest eine Eigenschaftsliste (Schlüssel- und Elementpaare) aus dem Eingabebyte-Stream. Der Eingabestream hat ein einfaches zeilenorientiertes Format, wie in load (Reader) angegeben, und es wird davon ausgegangen, dass die ISO 8859-1-Zeichencodierung verwendet wird . Das heißt, jedes Byte ist ein Latin1-Zeichen. Zeichen, die nicht in Latin1 enthalten sind, und bestimmte Sonderzeichen werden in Schlüsseln und Elementen mithilfe von Unicode-Escapezeichen dargestellt, wie in Abschnitt 3.3 der Java ™ -Sprachspezifikation definiert.
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 Eigenschaftendatei text_utf8.properties
in eine gültige ISO-8859-1-codierte Eigenschaftendatei konvertiert text.properties
.
native2ascii -codierung UTF-8 text_utf8.properties text.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 lesen InputStreamReader
, sodass Sie sie einfach als UTF-8 speichern können, ohne sich damit herumschlagen zu müssen native2ascii
. Hier ist ein Kickoff-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;
}
}
Dies kann wie folgt verwendet werden:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Siehe auch: