Servlet của tôi sẽ không sử dụng UTF-8 cho các câu trả lời JSON.Tại sao Servlet của tôi không đáp ứng các yêu cầu JSON trong UTF-8?
MyServlet.java:
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception {
PrintWriter writer = res.getWriter();
res.setCharacterEncoding("UTF-8");
res.setContentType("application/json; charset=UTF-8");
writer.print(getSomeJson());
}
}
Nhưng nhân vật đặc biệt không được hiển thị, và khi tôi kiểm tra các tiêu đề mà tôi nhận được trở lại trong Firebug, tôi thấy Content-Type: application/json;charset=ISO-8859-1
.
Tôi đã thực hiện một grep -ri iso .
trong thư mục Servlet của mình và không có gì cả, vì vậy không nơi nào tôi đặt rõ ràng loại thành ISO-8859-1. Tôi cũng nên chỉ rõ rằng tôi đang chạy trên Tomcat 7 trong Eclipse với mục tiêu J2EE như một môi trường phát triển, với Solaris 10 và bất cứ điều gì họ gọi là môi trường máy chủ web của họ (ai đó quản trị điều này) như môi trường sản xuất, và hành vi là như nhau.
Tôi cũng xác nhận rằng yêu cầu được gửi là UTF-8 và chỉ phản hồi là ISO-8859-1.
Cập nhật
Tôi đã sửa đổi mã để phản ánh rằng tôi đang gọi PrintWriter trước khi tôi đặt mã hóa ký tự. Tôi đã bỏ qua điều này từ ví dụ ban đầu của mình, và bây giờ tôi nhận ra rằng đây là nguồn gốc của vấn đề của tôi. Tôi đọc here mà bạn phải đặt mã hóa ký tự trước khi gọi HttpServletResponse.getWriter()
hoặc getWriter sẽ đặt mã đó thành ISO-8859-1 cho bạn.
Đây là vấn đề của tôi. Vì vậy, ví dụ trên phải được điều chỉnh thành
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception {
res.setCharacterEncoding("UTF-8");
res.setContentType("application/json");
PrintWriter writer = res.getWriter();
writer.print(getSomeJson());
}
}
Cảm ơn bạn đã "Cập nhật", đó chính xác là những gì tôi đang tìm kiếm: Đặt mã hóa ký tự đầu tiên, Thứ hai là người viết. –