Saya perlu membuat UTF-8 bekerja di webapp Java saya (servlets + JSP, tidak ada kerangka kerja yang digunakan) untuk mendukung äöå
dll untuk teks Finlandia biasa dan huruf Cyrillic seperti ЦжФ
untuk kasus khusus.
Setup saya adalah sebagai berikut:
- Lingkungan pengembangan: Windows XP
- Lingkungan produksi: Debian
Basis data yang digunakan: MySQL 5.x
Pengguna terutama menggunakan Firefox2 tetapi juga Opera 9.x, FF3, IE7 dan Google Chrome digunakan untuk mengakses situs.
Bagaimana cara mencapai ini?
Jawaban:
Menjawab diri saya sebagai FAQ situs ini mendorongnya. Ini bekerja untuk saya:
Sebagian besar karakter äåö tidak bermasalah karena set karakter default yang digunakan oleh browser dan tomcat / java untuk webapps adalah latin1 yaitu. ISO-8859-1 yang "memahami" karakter-karakter itu.
Untuk membuat UTF-8 bekerja di bawah Java + Tomcat + Linux / Windows + Mysql memerlukan yang berikut ini:
Mengkonfigurasi server Tomcat.xml
Penting untuk mengonfigurasi bahwa konektor menggunakan UTF-8 untuk menyandikan parameter url (GET request):
Bagian kuncinya adalah URIEncoding = "UTF-8" pada contoh di atas. Ini menjamin bahwa Tomcat menangani semua parameter GET yang masuk saat UTF-8 dikodekan. Akibatnya, saat pengguna menulis yang berikut ke bilah alamat browser:
karakter ж ditangani sebagai UTF-8 dan dikodekan ke (biasanya oleh browser bahkan sebelum sampai ke server) sebagai % D0% B6 .
Permintaan POST tidak terpengaruh oleh ini.
Filter Charset
Maka inilah saatnya untuk memaksa webapp java untuk menangani semua permintaan dan tanggapan ketika UTF-8 dikodekan. Ini mengharuskan kami menetapkan filter rangkaian karakter seperti berikut:
Filter ini memastikan bahwa jika browser belum mengatur pengkodean yang digunakan dalam permintaan, itu diatur ke UTF-8.
Hal lain yang dilakukan oleh filter ini adalah mengatur pengkodean respons default, mis. pengkodean di mana html dikembalikan / apa pun. Alternatifnya adalah mengatur pengkodean respons, dll. Di setiap pengontrol aplikasi.
Filter ini harus ditambahkan ke web.xml atau deskriptor penggunaan webapp:
Petunjuk untuk membuat filter ini dapat ditemukan di tomcat wiki ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )
Pengkodean halaman JSP
Di web.xml Anda , tambahkan berikut ini:
Sebagai alternatif, semua halaman JSP dari webapp perlu memiliki yang berikut di atas mereka:
Jika beberapa jenis tata letak dengan fragmen JSP yang berbeda digunakan, maka ini diperlukan pada semuanya .
Tag meta HTML
Pengkodean halaman JSP memberitahu JVM untuk menangani karakter di halaman JSP dalam pengkodean yang benar. Maka inilah saatnya untuk memberi tahu browser tempat penyandian laman html adalah:
Ini dilakukan dengan yang berikut di bagian atas setiap halaman xhtml yang dihasilkan oleh webapp:
Koneksi JDBC
Saat menggunakan db, harus didefinisikan bahwa koneksi menggunakan pengkodean UTF-8. Ini dilakukan dalam context.xml atau di mana pun koneksi JDBC didefinisikan sebagai berikut:
Database dan tabel MySQL
Basis data yang digunakan harus menggunakan pengkodean UTF-8. Ini dicapai dengan membuat database dengan yang berikut:
Kemudian, semua tabel harus dalam UTF-8 juga:
Bagian kuncinya adalah CHARSET = utf8 .
Konfigurasi server MySQL
Serveri MySQL juga harus dikonfigurasi. Biasanya ini dilakukan di Windows dengan memodifikasi my.ini -file dan di Linux dengan mengkonfigurasi my.cnf -file. Dalam file-file itu harus didefinisikan bahwa semua klien yang terhubung ke server menggunakan utf8 sebagai set karakter default dan bahwa charset default yang digunakan oleh server juga utf8.
Prosedur dan fungsi Mysql
Ini juga perlu memiliki set karakter yang ditentukan. Sebagai contoh:
DAPATKAN permintaan: latin1 dan UTF-8
Jika dan ketika didefinisikan dalam server tomcat.xml bahwa parameter permintaan GET dikodekan dalam UTF-8, permintaan GET berikut ditangani dengan benar:
Karena karakter ASCII dikodekan dengan cara yang sama baik dengan latin1 dan UTF-8, string "Petteri" ditangani dengan benar.
Karakter Cyrillic ж sama sekali tidak dipahami dalam bahasa latin1. Karena Tomcat diinstruksikan untuk menangani parameter permintaan sebagai UTF-8 ia mengkodekan karakter itu dengan benar sebagai % D0% B6 .
Jika dan ketika browser diperintahkan untuk membaca halaman-halaman dalam pengkodean UTF-8 (dengan header permintaan dan meta-tag html), setidaknya Firefox 2/3 dan browser lain dari periode ini semuanya mengkodekan karakternya sendiri sebagai % D0% B6 .
Hasil akhirnya adalah bahwa semua pengguna dengan nama "Petteri" ditemukan dan juga semua pengguna dengan nama "ж" ditemukan.
Tapi bagaimana dengan äåö?
Spesifikasi HTTP menentukan bahwa URL default disandikan sebagai latin1. Ini menghasilkan firefox2, firefox3 dll. Menyandikan yang berikut ini
masuk ke versi yang disandikan
Dalam latin1 karakter ä dikodekan sebagai % E4 . Meskipun halaman / permintaan / semuanya didefinisikan untuk menggunakan UTF-8 . Versi disandikan UTF-8 dari ä adalah % C3% A4
Hasil dari ini adalah bahwa sangat tidak mungkin bagi webapp untuk secara benar menangani parameter permintaan dari permintaan GET karena beberapa karakter dikodekan dalam latin1 dan lainnya di UTF-8. Perhatian: Permintaan POST berfungsi karena browser menyandikan semua parameter permintaan dari formulir sepenuhnya di UTF-8 jika halaman didefinisikan sebagai UTF-8
Barang untuk dibaca
Terima kasih banyak untuk penulis-penulis di bawah ini karena telah memberikan jawaban untuk masalah saya:
Catatan penting
mysqlmendukung Basic Multilingual Plane menggunakan 3-byte karakter UTF-8. Jika Anda perlu keluar dari itu (huruf tertentu membutuhkan lebih dari 3-byte dari UTF-8), maka Anda harus menggunakan rasa
VARBINARY
tipe kolom atau menggunakan rangkaianutf8mb4
karakter (yang membutuhkan MySQL 5.5.3 atau lebih baru). Perlu diketahui bahwa menggunakanutf8
karakter yang diatur dalam MySQL tidak akan berfungsi 100% dari waktu.Tomcat dengan Apache
Satu hal lagi Jika Anda menggunakan konektor Apache + Tomcat + mod_JK maka Anda juga perlu melakukan perubahan berikut:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
/etc/httpd/conf
dan menambahkanAddDefaultCharset utf-8
dihttpd.conf file
. Catatan: Pertama periksa apakah ada atau tidak. Jika ada, Anda dapat memperbaruinya dengan baris ini. Anda dapat menambahkan baris ini di bagian bawah juga.sumber
pageEncoding
, sehingga Anda bahkan bisa meninggalkannya. 2) di database MySQL dan tabel yang Anda gunakanutf8_swedish_si
, ini seharusnyautf8_unicode_ci
. Anda bahkan dapat meninggalkan pemeriksaan,CHARACTER SET utf8
cukup saja.<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
2. Buka folder apache Anda/etc/httpd/conf
dan tambahkanAddDefaultCharset utf-8
file 'httpd.conf'. Catatan: periksa dulu apakah ada atau tidak. Jika ada, Anda dapat memperbaruinya dengan baris ini. Anda dapat menambahkan baris ini di bagian bawah juga.Saya pikir Anda menyimpulkannya dengan cukup baik dalam jawaban Anda sendiri.
Dalam proses UTF-8-ing (?) Dari ujung ke ujung Anda mungkin juga ingin memastikan java sendiri menggunakan UTF-8. Gunakan -Dfile.encoding = utf-8 sebagai parameter untuk JVM (dapat dikonfigurasi dalam catalina.bat).
sumber
Untuk menambah jawaban kosoant , jika Anda menggunakan Spring, daripada menulis filter Servlet Anda sendiri, Anda bisa menggunakan kelas yang
org.springframework.web.filter.CharacterEncodingFilter
mereka sediakan, mengonfigurasinya seperti berikut di web.xml Anda:sumber
Saya juga ingin menambahkan dari sini bagian ini memecahkan masalah utf saya:
sumber
Ini untuk Pengkodean Yunani di tabel MySql ketika kami ingin mengaksesnya menggunakan Java:
Gunakan pengaturan koneksi berikut di kumpulan koneksi JBoss Anda (mysql-ds.xml)
Jika Anda tidak ingin meletakkan ini di kumpulan koneksi JNDI, Anda dapat mengkonfigurasinya sebagai url JDBC seperti yang digambarkan baris berikut:
Bagi saya dan Nick, jadi kami tidak pernah melupakannya dan membuang waktu lagi .....
sumber
Jawaban terinci yang bagus. hanya ingin menambahkan satu hal lagi yang pasti akan membantu orang lain untuk melihat pengkodean UTF-8 pada URL yang sedang beraksi.
Ikuti langkah-langkah di bawah ini untuk mengaktifkan pengkodean UTF-8 pada URL di firefox.
ketik "about: config" di bilah alamat.
Gunakan tipe input filter untuk mencari properti "network.standard-url.encode-query-utf8".
Pengkodean UTF-8 pada URL berfungsi secara default di IE6 / 7/8 dan chrome.
sumber
Respons sebelumnya tidak berhasil dengan masalah saya. Itu hanya dalam produksi, dengan tomcat dan apache mod_proxy_ajp. Posting tubuh hilang ascii chars oleh? Masalahnya akhirnya adalah dengan JVM defaultCharset (US-ASCII dalam instalasi default: Charset dfset = Charset.defaultCharset ();) jadi, solusi dijalankan tomcat server dengan pengubah untuk menjalankan JVM dengan UTF-8 sebagai charset default:
(tambahkan baris ini ke catalina.sh dan layanan tomcat restart)
Mungkin Anda juga harus mengubah variabel sistem linux (edit ~ / .bashrc dan ~ /. Profil untuk perubahan permanen, lihat https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )
sumber
Saya dengan masalah yang sama, tetapi, dalam nama file file saya mengompresi dengan apache commons. Jadi, saya menyelesaikannya dengan perintah ini:
ini bekerja sangat baik untuk saya. Semoga ini bisa membantu siapa saja;)
sumber
Untuk kasus saya menampilkan karakter Unicode dari bundel pesan, saya tidak perlu menerapkan bagian "JSP page encoding" untuk menampilkan Unicode pada halaman jsp saya. Yang saya butuhkan adalah bagian "CharsetFilter".
sumber
Satu hal lain yang belum disebutkan berkaitan dengan Java Servlets yang bekerja dengan Ajax. Saya memiliki situasi di mana halaman web mengambil teks utf-8 dari pengguna yang mengirim ini ke file JavaScript yang memasukkannya ke dalam URI yang dikirim ke Servlet. Servlet menanyakan database, menangkap hasilnya dan mengembalikannya sebagai XML ke file JavaScript yang memformatnya dan memasukkan respons yang diformat ke dalam halaman web asli.
Dalam satu aplikasi web saya mengikuti instruksi buku Ajax awal untuk menyelesaikan JavaScript dalam membangun URI. Contoh dalam buku ini menggunakan metode escape (), yang saya temukan (dengan cara yang sulit) salah. Untuk utf-8 Anda harus menggunakan komponen encodeURIC ().
Beberapa orang tampaknya menggulung Ajax mereka sendiri hari ini, tapi saya pikir saya mungkin juga menambahkan ini.
sumber
Tentang
CharsetFilter
disebutkan dalam jawaban @kosoant ....Ada membangun
Filter
di kucing jantanweb.xml
(terletak diconf/web.xml
). Filter dinamaisetCharacterEncodingFilter
dan dikomentari secara default. Anda dapat menghapus komentar ini (Harap ingat untuk membatalkan komentarnyafilter-mapping
)Juga tidak perlu diatur
jsp-config
dalam Andaweb.xml
(saya telah mengujinya untuk Tomcat 7+)sumber
Beberapa waktu Anda dapat menyelesaikan masalah melalui wisaya Administrator MySQL. Di
dan atur Def. Set char: utf8
Mungkin konfigurasi ini perlu me-restart MySQL.
sumber
Menghadapi masalah yang sama pada Spring MVC 5 + Tomcat 9 + JSP.
Setelah penelitian panjang, datang ke solusi elegan ( tidak perlu filter dan tidak perlu perubahan di server Tomcat.xml (mulai dari versi 8.0.0-RC3))
Dalam implementasi WebMvcConfigurer mengatur pengodean default untuk messageSource (untuk membaca data dari file sumber pesan dalam pengkodean UTF-8.
Dalam implementasi DispatcherServletInitializer @Override metode onStartup dan tetapkan permintaan dan pengkodean karakter sumber daya di dalamnya.
Simpan semua sumber pesan dan lihat file dalam pengkodean UTF-8.
Tambahkan <% @ page contentType = "text / html; charset = UTF-8"%> atau <% @ page pageEncoding = "UTF-8"%> di setiap file * .jsp atau tambahkan deskriptor jsp-config ke web.xml
sumber
Jika Anda telah menentukan dalam kumpulan koneksi (mysql-ds.xml), dalam kode Java Anda, Anda dapat membuka koneksi sebagai berikut:
sumber