Почему мой сервлет не отвечает на запросы JSON в UTF-8? - PullRequest
12 голосов
/ 17 сентября 2010

Мой сервлет просто не будет использовать 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 . в своем каталоге сервлетов и ничего не нашел, так что я нигде явноустановка типа в 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());
  }
}

Ответы [ 3 ]

4 голосов
/ 17 сентября 2010

Как только кодировка установлена ​​для ответа, она не может быть изменена.

Самый простой способ форсировать UTF-8 - создать собственный фильтр, который первым заглянет в ответ и установит кодировку.

Взгляните на , как Spring 3.0 делает это . Даже если вы не можете использовать Spring в своем проекте, возможно, вы можете получить вдохновение ( убедитесь, что политика вашей компании позволяет вам получать вдохновение от лицензий с открытым исходным кодом ).

1 голос
/ 17 сентября 2010

Код выглядит хорошо. Либо вы не запускаете код, который, как вы думаете, вы выполняете, либо в цепочке запрос-ответ есть какой-то Filter или прокси, который изменяет тип контента следующим образом.

0 голосов
/ 19 сентября 2010

Помимо конкретной проблемы, вы действительно должны рассмотреть возможность получения выходного потока, используя библиотеку JSON для записи содержимого непосредственно в виде JSON в кодировке UTF-8; использование писателей бесполезно. Некоторые пакеты JSON работают только со строками, что, к сожалению, но большинство позволяет использовать более эффективные потоки (более безопасный и эффективный, так как парсер / генератор может обрабатывать аспекты экранирования и кодирования вместе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...