为什么POST不尊重charset,但是AJAX请求呢? tomcat 6

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

我使用了fiddler,并确定了请求的唯一区别,就是在ajax调用中将charset = utf-8附加到Content-Type头的末尾(正如预期的那样,因为我明确地发送了内容类型)。

来自ajax的ContentType:“application / x-www-form-urlencoded; charset = utf-8”

来自表单的ContentType:“application / x-www-form-urlencoded”

我有以下设置:

ajax post(正确输出chars):

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

表格post(在iso中输出字符)

  

xml声明:

  

文档类型:

  

元标记:

  

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声明或其他任何内容。 我已经花了三天时间来完成这项工作,而且我的想法已经不多了。 谁能帮我?

表格post(在iso中输出字符)

  

您不需要在那里指定字符集。 浏览器将使用HTTP响应头中指定的字符集。

只是

 

足够。


xml声明:

  

无关紧要。 它仅与XML解析器相关。 Web浏览器不会将text/html解析为XML。 这仅与服务器端相关(如果您使用基于XML的视图技术,如Facelets或JSPX,则在普通JSP上这是多余的)。


文档类型:

  

无关紧要。 它仅与HTML解析器相关。 此外,它没有指定任何字符集。 相反,将使用HTTP响应头中的那个。 如果您没有使用像Facelets或JSPX这样的基于XML的视图技术,那么这可以是


元标记:

  

无关紧要。 仅在从本地磁盘查看HTML页面或在本地解析HTML页面时才有意义。 相反,将使用HTTP响应头中的那个。


jvm参数:

 -Dfile.encoding=UTF-8 

无关紧要。 它只与Sun / Oracle(!)JVM有关,可以解析源文件。


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

这只有在尚未解析请求体时才会起作用(即您之前没有调用过getParameter()等)。 你需要尽早打电话。 Filter是一个完美的地方。 否则将被忽略。


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

它依赖于HTTP响应头。

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

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

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

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

  2. 创建一个在doFilter()方法中doFilter()以下操作的Filter

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

    这将使POST请求正文将被处理为UTF-8。

  3. 更改Tomcat/conf/server.xml条目,如下所示:

      

    这将使GET查询字符串被处理为UTF-8。

也可以看看:

  • Unicode – 如何使角色正确? – 包含Java EE Web开发人员的实用背景信息和详细解决方案。

尝试这个 :

 How do I change how POST parameters are interpreted? 

POST请求应指定它们发送的参数和值的编码。 由于许多客户端无法设置显式编码,因此使用默认值(ISO-8859-1)。 在许多情况下,这不是首选解释,因此可以使用javax.servlet.Filter来设置请求编码。 编写这样的filter是微不足道的。 此外,Tomcat已经提供了这样的示例filter。

请看看:

 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

你试过accept-charset="UTF-8"吗? 如你所说,数据应该根据页面本身的编码进行编码; tomcat忽略了这一点似乎很奇怪。 您正在尝试使用哪种浏览器?

您是否尝试在conf/server.xml为HTTP连接器指定useBodyEncodingForURL="true"

我根据这篇文章中的信息实现了一个filter,现在它正在运行。 但是,这仍然无法解释为什么即使页面是UTF-8,tomcat用来解释它的字符集也是ISO-9951-1。