Saya perlu menggunakan UTF-8 di properti sumber daya saya menggunakan Java ResourceBundle
. Ketika saya memasukkan teks langsung ke file properti, ini akan ditampilkan sebagai mojibake.
Aplikasi saya berjalan di Google App Engine.
Adakah yang bisa memberi saya contoh? Saya tidak bisa mendapatkan pekerjaan ini.
java.util.ResourceBundle
, bukanjava.util.Properties
.Jawaban:
The
ResourceBundle#getBundle()
penggunaan di bawah selimutPropertyResourceBundle
ketika.properties
file yang ditentukan. Ini pada gilirannya menggunakan secara defaultProperties#load(InputStream)
untuk memuat file properti tersebut. Sesuai javadoc , mereka secara default dibaca sebagai ISO-8859-1.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-8text_utf8.properties
menjadi file properti yang disandikan ISO-8859-1 yang validtext.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-8InputStreamReader
, sehingga Anda bisa menyimpannya sebagai UTF-8 tanpa perlu repotnative2ascii
. Berikut ini adalah contoh kickoff:Ini dapat digunakan sebagai berikut:
Lihat juga:
sumber
StandardCharsets.UTF_8
jika Anda menggunakan Java 7+Mengingat Anda memiliki instance ResourceBundle dan Anda bisa mendapatkan String dengan:
Saya memecahkan masalah tampilan Jepang saya dengan:
sumber
lihat ini: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)
properti menerima objek Reader sebagai argumen, yang dapat Anda buat dari InputStream.
pada saat membuat, Anda dapat menentukan pengkodean Pembaca:
lalu terapkan Pembaca ini ke metode memuat:
BTW: dapatkan aliran dari file .properties :
BTW: dapatkan bundel sumber daya dari
InputStreamReader
:Semoga ini bisa membantu Anda!
sumber
ResourceBundle
.Properties
dan Anda ingin mengambilUTF-8
String maka ini berfungsi seperti pesona. Namun untukResourceBundle
sumber daya bahasa maka jawaban yang diterima elegan. Namun demikian, memilih suara.ResourceBundle rb = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"))
ResourceBundle.Control
dengan UTF-8 dan metode String baru tidak berfungsi, jika file properti menggunakan cp1251 charset, misalnya.Jadi saya merekomendasikan menggunakan metode umum: menulis dalam simbol unicode . Untuk ini:
IDEA - memiliki khusus " Transparan konversi asli-to-ASCII " option (Pengaturan> Berkas Encoding).
Eclipse - memiliki plugin " Properties Editor " . Ini dapat berfungsi sebagai aplikasi terpisah.
sumber
Masalah ini akhirnya telah diperbaiki di Java 9: https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9
Pengkodean default untuk file properti sekarang adalah UTF-8.
sumber
Kami membuat file resources.utf8 yang berisi sumber daya di UTF-8 dan memiliki aturan untuk menjalankan berikut ini:
sumber
native2ascii
? Saya baru saja melakukannyafind / -name native2ascii*
dan tidak mendapatkan hasil, jadi saya berasumsi itu bukan hanya bagian dari JDK ...jdk1.*.0_*/bin
.sumber
Perhatian: file properti java harus dikodekan dalam ISO 8859-1!
@lihat Properti Java Doc
Jika Anda masih benar-benar ingin melakukan ini: lihatlah: Java properties UTF-8 encoding di Eclipse - ada beberapa contoh kode
sumber
http://sourceforge.net/projects/eclipse-rbe/
seperti yang sudah dinyatakan file properti harus dikodekan dalam ISO 8859-1
Anda dapat menggunakan plugin di atas untuk gerhana IDE untuk membuat konversi Unicode untuk Anda.
sumber
Berikut adalah solusi Java 7 yang menggunakan pustaka dukungan Guava yang sangat baik dan konstruk try-with-resources. Itu membaca dan menulis file properti menggunakan UTF-8 untuk pengalaman keseluruhan yang paling sederhana.
Untuk membaca file properti sebagai UTF-8:
Untuk menulis file properti sebagai UTF-8:
sumber
Seperti yang disarankan, saya pergi melalui implementasi bundel sumber daya .. tapi itu tidak membantu .. karena bundel selalu disebut di bawah en_US lokal ... saya mencoba untuk menetapkan lokal default saya ke bahasa yang berbeda dan masih penerapan bundel sumber daya saya kontrol dipanggil dengan en_US ... saya mencoba untuk menempatkan pesan log dan melakukan langkah melalui debug dan melihat apakah panggilan lokal yang berbeda dilakukan setelah saya mengubah lokal pada saat dijalankan melalui xhtml dan panggilan JSF ... yang tidak terjadi ... maka saya mencoba untuk melakukan sistem yang ditetapkan default untuk utf8 untuk membaca file oleh server saya (tomcat server) .. tapi itu menyebabkan masalah karena semua perpustakaan kelas saya tidak dikompilasi di bawah utf8 dan tomcat mulai membaca kemudian dalam format utf8 dan server tidak berjalan dengan benar ... maka saya akhirnya menerapkan metode di pengontrol java saya untuk dipanggil dari file xhtml ..dalam metode itu saya melakukan hal berikut:
Saya sangat gugup karena ini dapat memperlambat kinerja aplikasi saya ... namun, setelah menerapkan ini, sepertinya aplikasi saya lebih cepat sekarang .. saya pikir itu karena, saya sekarang langsung mengakses properti daripada membiarkan JSF menguraikan cara mengakses properti ... saya secara khusus melewati argumen Boolean dalam panggilan ini karena saya tahu beberapa properti tidak akan diterjemahkan dan tidak perlu dalam format utf8 ...
Sekarang saya telah menyimpan file properti saya dalam format UTF8 dan berfungsi dengan baik karena setiap pengguna dalam aplikasi saya memiliki preferensi lokal referensi.
sumber
sumber
Untuk apa layaknya masalah saya adalah bahwa file-file itu sendiri berada dalam pengkodean yang salah. Menggunakan iconv bekerja untuk saya
sumber
iconv
. Saya belum pernah mendengarnya sebelumnya tetapi saya mengetiknya di konsol dan lihatlah, itu adalah sesuatu yang ada (di CentOS 6, lagian.)Saya mencoba menggunakan pendekatan yang diberikan oleh Rod, tetapi dengan mempertimbangkan keprihatinan BalusC tentang tidak mengulangi pekerjaan yang sama di semua aplikasi dan datang dengan kelas ini:
Cara menggunakan ini akan sangat mirip dengan penggunaan ResourceBundle biasa:
Atau Anda dapat menggunakan konstruktor alternatif yang menggunakan UTF-8 secara default:
sumber
Buka dialog Pengaturan / Preferensi ( Ctrl+ Alt+ S), lalu klik Editor dan Penyandian File.
Kemudian, di bagian bawah, Anda akan meraba penyandian default untuk file properti. Pilih jenis penyandian Anda.
Atau Anda dapat menggunakan simbol unicode alih-alih teks dalam bundel sumber daya Anda (misalnya
"ів"
sama dengan\u0456\u0432
)sumber
Dari Java 9, default untuk memuat file properti telah diubah menjadi UTF-8. https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm
sumber