为什么 POST 不支持字符集,而 AJAX 请求却支持字符集?雄猫 6

我有一个基于tomcat的应用程序,需要提交能够处理utf-8字符的表单。当通过 ajax 提交时,数据从 utf-8 中的 getParameter() 正确返回。通过表单发布提交时,数据从 iso-8859-1 中的 getParameter() 返回。

我使用了fiddler,并且已经确定了请求中的唯一区别,即charset=utf-8被附加到ajax调用中Content-Type标头的末尾(正如预期的那样,因为我显式发送了内容类型)。

ContentType from ajax: “application/x-www-form-urlencoded;字符集 = utf-8”

ContentType from form: “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) { 
  }
 });

表单发布(输出 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 的数据

总而言之,post 请求不会将字符集作为 utf-8 发送,尽管页面是 utf-8 格式参数,指定 utf-8 的表单参数,xml 声明或其他任何内容。我花了三天的大部分时间在这上面,没有想法了。任何人都可以帮我吗?


答案 1

表单发布(输出 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不会解析为XML。这只与服务器端相关(如果您使用的是基于XML的视图技术,如Facelets或JSPX,则在普通JSP上这是多余的)。text/html


文档类型:

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


我也尝试过使用,但似乎tomcat只是忽略了它。我没有使用 RequestDumper 阀。request.setCharacterEncoding("UTF-8");

这仅在请求正文尚未解析时才有效(即您事先尚未调用等)。您需要尽早调用它。A是一个完美的地方。否则它将被忽略。getParameter()Filter


根据我所读到的内容,POST数据编码主要取决于表单所在的页面编码。据我所知,我的页面以utf-8正确编码。

它依赖于 HTTP 响应标头。

您需要做的是以下三件事:

  1. 将以下内容添加到 JSP 的顶部:

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

    这会将响应编码设置为 UTF-8,并将响应标头设置为 UTF-8。

  2. 创建一个在方法中执行以下操作的方法:FilterdoFilter()

    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 进行处理。

另请参阅:


答案 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


推荐