Trong UTF-8, Упячка
thực sự phải được biểu diễn dưới dạng \x423\x43F\x44F\x447\x43A\x430
. \xD0\xA3\xD0\xBF\xD1\x8F...
ngụ ý rằng chúng được mã hóa không chính xác bằng ISO-8859-1.
Đây là đoạn mã thử nghiệm chứng minh điều này:
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);
}
Bản in nào
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
Vì vậy, vấn đề của bạn cần phải được giải quyết trước một bước. Vì bạn đang nói về một ứng dụng web Java và chuỗi này có thể là kết quả từ thông tin nhập của người dùng, bạn có chắc chắn rằng bạn đã quan tâm đến yêu cầu HTTP và mã hóa phản hồi không? Đầu tiên, trong JSP, bạn cần thêm những thứ sau vào đầu JSP:
<%@ page pageEncoding="UTF-8" %>
Điều này không chỉ hiển thị trang trong UTF-8 mà còn đặt ngầm một HTTP Content-Type
tiêu đề phản hồi hướng dẫn khách hàng rằng trang được hiển thị bằng UTF-8, để khách hàng biết rằng nó sẽ hiển thị bất kỳ nội dung nào và xử lý bất kỳ biểu mẫu nào bằng cách sử dụng cùng một mã hóa.
Bây giờ, phần yêu cầu HTTP, đối với các yêu cầu GET, bạn cần phải cấu hình trình điều khiển servlet được đề cập. Ví dụ:trong Tomcat, đây là vấn đề đặt URIEncoding
thuộc tính của trình kết nối HTTP
trong /conf/server.xml
cho phù hợp. Đối với các yêu cầu POST, điều này phải được thực hiện bởi máy khách (trình duyệt web) đủ thông minh để sử dụng mã hóa phản hồi như được chỉ định trong JSP. Nếu không, thì bạn sẽ cần đưa vào Filter
mà kiểm tra và bộ
mã hóa yêu cầu.
Để biết thêm thông tin cơ bản, bạn có thể tìm thấy bài viết này hữu ích.
Ngoài tất cả những điều này, MySQL còn có một vấn đề khác với các ký tự Unicode. Nó chỉ hỗ trợ các ký tự UTF-8 tối đa 3 byte , không phải 4 byte. Nói cách khác, chỉ có dải BMP gồm 65535 ký tự được hỗ trợ, bên ngoài thì không. Ví dụ như PostgreSQL hỗ trợ nó đầy đủ. Điều này có thể không ảnh hưởng đến ứng dụng web của bạn, nhưng đây chắc chắn là điều cần lưu ý.