Подтвердить что ты не робот

Почему POST не выполняет чарсет, но делает запрос AJAX? tomcat 6

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

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

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

ContentType из формы: "Применение/х-WWW-форм-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:

<!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" ); и echos данные, которые вы публикуете. http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

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

4b9b3361

Ответ 1

form post (выводит символы в 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. Webbrowsers не анализирует text/html как XML. Это относится только к стороне сервера (если вы используете технологию просмотра на основе XML, такую ​​как Facelets или JSPX, на простом JSP это лишнее).


Doctype:

<!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.

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

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

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

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

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

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

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

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

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

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

См. также:

Ответ 2

Попробуйте следующее:

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

Ответ 3

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

Ответ 4

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

Ответ 5

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