Do ResourceBundle#getBundle()
zastosowania pod kołdrą PropertyResourceBundle
, gdy .properties
plik jest określona. To z kolei domyślnie używa Properties#load(InputStream)
do ładowania tych plików właściwości. Zgodnie z javadoc są one domyślnie czytane jako ISO-8859-1.
public void load(InputStream inStream) throws IOException
Odczytuje listę właściwości (pary kluczy i elementów) z wejściowego strumienia bajtów. Strumień wejściowy jest w prostym formacie zorientowanym liniowo, określonym w load (Reader) i zakłada się, że wykorzystuje kodowanie znaków ISO 8859-1 ; to znaczy, że każdy bajt to jeden znak Latin1. Znaki spoza alfabetu łacińskiego 1 oraz niektóre znaki specjalne są reprezentowane w kluczach i elementach za pomocą znaków ucieczki Unicode zgodnie z definicją w sekcji 3.3 specyfikacji języka Java ™.
Musisz więc zapisać je jako ISO-8859-1. Jeśli masz jakieś znaki poza zakresem ISO-8859-1 i nie możesz użyć \uXXXX
czubka głowy, a zatem jesteś zmuszony zapisać plik jako UTF-8, musisz użyć narzędzia native2ascii do konwersji Plik właściwości zapisanych w UTF-8 do pliku właściwości zapisanych w ISO-8859-1, w którym wszystkie odkryte znaki są konwertowane na \uXXXX
format. Poniższy przykład konwertuje plik właściwości zakodowany w UTF-8 text_utf8.properties
na prawidłowy plik właściwości zakodowany w standardzie ISO-8859-1 text.properties
.
native2ascii -encoding UTF-8 text_utf8.properties text.properties
Gdy używasz rozsądnego IDE, takiego jak Eclipse, jest to już automatycznie wykonywane, gdy tworzysz .properties
plik w projekcie opartym na Javie i używasz własnego edytora Eclipse. Eclipse w sposób przezroczysty konwertuje znaki spoza zakresu ISO-8859-1 na \uXXXX
format. Zobacz także poniższe zrzuty ekranu (zwróć uwagę na zakładki „Właściwości” i „Źródło” u dołu, kliknij, aby wyświetlić duże):
Alternatywnie, możesz również utworzyć niestandardową ResourceBundle.Control
implementację, w której bezpośrednio odczytujesz pliki właściwości jako UTF-8 InputStreamReader
, dzięki czemu możesz po prostu zapisać je jako UTF-8 bez konieczności kłopotania się native2ascii
. Oto przykład:
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;
}
}
Można to wykorzystać w następujący sposób:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Zobacz też: