Di UTF-8, Упячка
sebenarnya harus direpresentasikan sebagai \x423\x43F\x44F\x447\x43A\x430
. \xD0\xA3\xD0\xBF\xD1\x8F...
menyiratkan bahwa mereka salah dikodekan menggunakan ISO-8859-1.
Berikut cuplikan pengujian yang membuktikan hal ini:
String s = new String("Упячка".getBytes("UTF-8"), "ISO-8859-1"); // First decode with UTF-8, then (incorrectly) encode with ISO-8859-1.
for (char c : s.toCharArray()) {
System.out.printf("\\x%X", (int) c);
}
Yang dicetak
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
Jadi masalah Anda perlu diselesaikan satu langkah sebelumnya. Karena Anda berbicara tentang aplikasi web Java dan string ini kemungkinan dihasilkan dari input pengguna, apakah Anda yakin telah memperhatikan permintaan HTTP dan penyandian respons? Pertama, di JSP, Anda perlu menambahkan berikut ini ke atas JSP:
<%@ page pageEncoding="UTF-8" %>
Ini tidak hanya merender halaman dalam UTF-8, tetapi juga secara implisit menetapkan HTTP Content-Type
header respons yang menginstruksikan klien bahwa halaman dirender menggunakan UTF-8, sehingga klien tahu bahwa itu harus menampilkan konten apa pun dan memproses formulir apa pun menggunakan penyandian yang sama.
Sekarang, bagian permintaan HTTP, untuk permintaan GET Anda perlu mengonfigurasi servletcontainer yang dimaksud. Di Tomcat misalnya, ini adalah masalah pengaturan URIEncoding
atribut konektor HTTP
di /conf/server.xml
demikian. Untuk permintaan POST, ini harus ditangani oleh klien (peramban web) yang cukup pintar untuk menggunakan penyandian respons seperti yang ditentukan dalam JSP. Jika tidak, Anda harus membawa Filter
yang memeriksa dan set
pengkodean permintaan.
Untuk informasi latar belakang lebih lanjut, Anda dapat menemukan artikel ini berguna.
Terlepas dari semua ini, MySQL memiliki masalah lain dengan karakter Unicode. Ini hanya mendukung karakter UTF-8 hingga 3 byte , bukan 4 byte. Dengan kata lain, hanya kisaran BMP 65535 karakter yang didukung, di luar tidak. PostgreSQL misalnya mendukungnya sepenuhnya. Ini mungkin tidak mengganggu aplikasi web Anda, tetapi ini pasti sesuatu yang perlu diingat.