The ResourceBundle#getBundle()
penggunaan di bawah selimut PropertyResourceBundle
ketika .properties
file yang ditentukan. Ini pada gilirannya menggunakan secara default Properties#load(InputStream)
untuk memuat file properti tersebut. Sesuai javadoc , mereka secara default dibaca sebagai ISO-8859-1.
public void load(InputStream inStream) throws IOException
Membaca daftar properti (pasangan kunci dan elemen) dari aliran byte input. Aliran input dalam format berorientasi garis sederhana seperti yang ditentukan dalam beban (Pembaca) dan diasumsikan menggunakan pengkodean karakter ISO 8859-1 ; yaitu setiap byte adalah satu karakter Latin1. Karakter tidak dalam Latin1, dan karakter khusus tertentu, diwakili dalam kunci dan elemen menggunakan Unicode escapes sebagaimana didefinisikan dalam bagian 3.3 dari Spesifikasi Bahasa Java ™.
Jadi, Anda harus menyimpannya sebagai ISO-8859-1. Jika Anda memiliki karakter di luar rentang ISO-8859-1 dan Anda tidak dapat menggunakan \uXXXX
off-head dan Anda terpaksa menyimpan file sebagai UTF-8, maka Anda harus menggunakan alat native2ascii untuk mengkonversi File properti tersimpan UTF-8 ke file properti tersimpan ISO-8859-1 di mana semua karakter yang tidak ditemukan dikonversi ke dalam \uXXXX
format. Contoh di bawah ini mengubah file properti yang disandikan UTF-8 text_utf8.properties
menjadi file properti yang disandikan ISO-8859-1 yang valid text.properties
.
native2ascii -encoding UTF-8 text_utf8.properties text.properties
Saat menggunakan IDE waras seperti Eclipse, ini sudah secara otomatis dilakukan ketika Anda membuat .properties
file dalam proyek berbasis Java dan menggunakan editor Eclipse sendiri. Eclipse akan secara transparan mengkonversi karakter di luar rentang ISO-8859-1 ke \uXXXX
format. Lihat juga di bawah tangkapan layar (perhatikan tab "Properti" dan "Sumber" di bagian bawah, klik untuk besar):
Atau, Anda juga bisa membuat ResourceBundle.Control
implementasi kustom di mana Anda secara eksplisit membaca file properti menggunakan UTF-8 InputStreamReader
, sehingga Anda bisa menyimpannya sebagai UTF-8 tanpa perlu repot native2ascii
. Berikut ini adalah contoh kickoff:
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;
}
}
Ini dapat digunakan sebagai berikut:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Lihat juga: