Почему выиграл? Мой сервлет отвечает на запросы JSON в UTF-8?

Мой сервлет просто не будет использовать UTF-8 для ответов JSON.

MyServlet3318] MyServlet3318] :

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. в моем каталоге сервлетов и ничего не придумал, так что нигде я явно не устанавливаю тип ISO-8859-1.

Я должен также укажите, что я запускаю это на Tomcat 7 в Eclipse с целью J2EE в качестве среды разработки, с Solaris 10 и тем, что они называют средой своего веб-сервера (кто-то другой администрирует это) в качестве производственной среды, и поведение такое же.

Я также подтвердил, что отправленный запрос - это UTF-8, и только ответ это ISO-8859-1.

Обновление

Я изменил код, чтобы отразить, что я вызываю 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());
  }
}

12
задан Justin Force 17 September 2010 в 19:21
поделиться