Почему POST не соблюдает кодировку, а AJAX-запрос? кот 6 - PullRequest
23 голосов
/ 09 декабря 2010

У меня есть приложение на основе Tomcat, которое должно отправить форму, способную обрабатывать символы utf-8.При отправке через ajax данные возвращаются корректно из getParameter () в utf-8.При отправке через форму сообщения, данные возвращаются из getParameter () в iso-8859-1.

Я использовал fiddler и определил только разницу в запросах: charset = utf-8 добавляется в конец Контента-Тип заголовка в вызове ajax (как и ожидалось, поскольку я отправляю тип содержимого явно).

ContentType из ajax: "application / x-www-form-urlencoded; charset = utf-8"

ContentType из формы: "application / x-www-form-urlencoded"

У меня есть следующие настройки:

ajax post (правильно выводит символы):

$.ajax( {
  type : "POST",
  url : "blah",
  async : false,
  contentType: "application/x-www-form-urlencoded; charset=utf-8",
  data  : data,
  success : function(data) { 
  }
 });

form post (выводит символы в iso)

 <form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">

XML-объявление:

<?xml version="1.0" encoding="utf-8"?>

Тип документа:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

метатег:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

Параметры jvm:

-Dfile.encoding=UTF-8

У меня также естьпопытался использовать request.setCharacterEncoding ("UTF-8"); , но кажется, что tomcat просто игнорирует его.Я не использую клапан RequestDumper.

Из того, что я прочитал, кодировка данных POST в основном зависит от кодировки страницы, в которой находится форма.Насколько я могу судить, моя страница правильно закодирована в utf-8.

Пример JSP с этой страницы работает правильно.Он просто использует setCharacterEncoding ("UTF-8"); и выводит данные, которые вы публикуете.http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

Итак, подведем итог: запрос на отправку не отправляет кодировку как utf-8, несмотря на то, что страница находится в utf-8, параметры формы указывают utf-8, объявление xml или что-то еще,Я потратил большую часть трех дней на это, и у меня заканчиваются идеи.Кто-нибудь может мне помочь?

Ответы [ 5 ]

18 голосов
/ 09 декабря 2010

форма сообщения (выводит символы в iso)

<form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">

Вам не нужно указывать кодировку там.Браузер будет использовать кодировку, указанную в заголовке ответа HTTP.

Достаточно просто

<form id="leadform" method="post" action="{//app/path}">

.


xml объявление:

<?xml version="1.0" encoding="utf-8"?>

Не имеет значения.Это актуально только для парсеров XML.Веб-браузеры не анализируют text/html как XML.Это относится только к стороне сервера (если вы используете технологию представления на основе XML, такую ​​как Facelets или JSPX, для простого JSP это излишне).


Тип документа:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Не имеет значения.Это актуально только для HTML-парсеров.Кроме того, он не указывает никакой кодировки.Вместо этого будет использован заголовок ответа HTTP.Если вы не используете технологию представления на основе XML, такую ​​как Facelets или JSPX, это может быть хорошим <!DOCTYPE html>.


метатегом:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

Ненужные.Это актуально только тогда, когда HTML-страница просматривается с локального диска или должна быть проанализирована локально.Вместо этого будет использоваться заголовок ответа HTTP.


jvm параметры:

-Dfile.encoding=UTF-8

Не имеет значения.Для Sun / Oracle (!) JVM подходит только для анализа исходных файлов.


Я также пытался использовать request.setCharacterEncoding("UTF-8");, но кажется, что tomcat просто игнорирует его.Я не использую клапан RequestDumper.

Это будет работать только тогда, когда тело запроса еще не было проанализировано (т.е. вы не вызывали getParameter() и т. Д. Заранее).Вы должны назвать это как можно раньше.A Filter - идеальное место для этого.В противном случае оно будет проигнорировано.


Из того, что я прочитал, кодировка данных POST в основном зависит от кодировки страницы, где находится форма.Насколько я могу судить, моя страница правильно закодирована в utf-8.

Это зависит от заголовка ответа HTTP.

Все, что вам нужно сделать, это следующие три вещи:

  1. Добавьте в начало JSP следующее:

    <%@page pageEncoding="UTF-8" %>
    

    Это установит кодировку ответа в UTF-8 и установит заголовок ответа в UTF-8..

  2. Создайте Filter, который выполняет следующие действия в методе doFilter():

    if (request.getCharacterEncoding() == null) {
        request.setCharacterEncoding("UTF-8");
    }
    chain.doFilter(request, response);
    

    Это приведет к тому, что тело запроса POST будет обработано как UTF.-8.

  3. Измените запись <Connector> в Tomcat/conf/server.xml следующим образом:

    <Connector (...) URIEncoding="UTF-8" />
    

    Это приведет к тому, что строки запроса GET будут обрабатываться как UTF-8.

См. Также:

1 голос
/ 09 декабря 2010

Попробуйте это:

How do I change how POST parameters are interpreted? 

POST-запросы должны указывать кодировку параметров и значений, которые они отправляют. Поскольку многие клиенты не могут установить явную кодировку, используется значение по умолчанию (ISO-8859-1). Во многих случаях это не предпочтительная интерпретация, поэтому можно использовать javax.servlet.Filter для установки кодировки запросов. Написание такого фильтра тривиально. Кроме того, Tomcat уже поставляется с таким примером фильтра.

Пожалуйста, посмотрите на:

5.x

webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java

webapps/jsp-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java

6.x

webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java

Для получения дополнительной информации обратитесь к ниже URL http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

0 голосов
/ 09 декабря 2010

Вы пытались указать useBodyEncodingForURL="true" в вашем conf/server.xml для HTTP-соединителя?

0 голосов
/ 09 декабря 2010

Я реализовал фильтр на основе информации в этой записи , и теперь он работает. Однако это по-прежнему не объясняет, почему, хотя страница была UTF-8, кодировка, используемая tomcat для ее интерпретации, была ISO-9951-1.

0 голосов
/ 09 декабря 2010

Вы пробовали accept-charset="UTF-8"? Как вы сказали, данные должны быть закодированы в соответствии с кодировкой самой страницы; кажется странным, что кот игнорирует это. В каком браузере вы это пробуете?

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