Мой сервлет просто не будет использовать UTF-8 для ответов JSON.
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());
}
}
Но специальные символы не отображаются, и когда я проверяю заголовки, что я возвращаюсь в Firebug, я вижу Content-Type: application/json;charset=ISO-8859-1
.
Я сделал grep -ri iso .
в моем каталоге Servlet и ничего не придумал, поэтому я не устанавливаю явно тип ISO-8859-1.
Я также должен указать, что я запускаю это на Tomcat 7 в Eclipse с целью J2EE в качестве среды разработки, с Solaris 10 и тем, что они называют своей средой веб-сервера (кто-то другой администратором) в качестве рабочей среды, и поведение одинаковое.
Я также подтвердил, что представленный запрос - это UTF-8, и только ответ - ISO-8859-1.
Update
Я изменил код, чтобы отразить, что я вызываю PrintWriter, прежде чем установить кодировку символов. Я проигнорировал это из моего первоначального примера, и теперь я понимаю, что это стало причиной моей проблемы. Я прочитал здесь, что вам нужно установить кодировку символов, прежде чем вы вызовете HttpServletResponse.getWriter()
, или getWriter установит его для ISO-8859-1 для вас.
Это была моя проблема. Поэтому приведенный выше пример должен быть скорректирован на
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());
}
}