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

Chr*_*ris 24 java ajax tomcat servlets character-encoding

我有一个基于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(正确输出字符):

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

表格帖子(在iso中输出字符)

 <form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">
Run Code Online (Sandbox Code Playgroud)

xml声明:

<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)

文档类型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)

元标记:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
Run Code Online (Sandbox Code Playgroud)

jvm参数:

-Dfile.encoding=UTF-8
Run Code Online (Sandbox Code Playgroud)

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

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

此页面中的示例JSP正常工作.它只使用setCharacterEncoding("UTF-8"); 并回复您发布的数据. http://wiki.apache.org/tomcat/FAQ/CharacterEncoding

总而言之,post请求不会将charset作为utf-8发送,尽管页面在utf-8中,表单参数指定utf-8,xml声明或其他任何内容.我已经花了三天的时间来完成这项工作,但我的想法已经不多了.谁能帮我?

Bal*_*usC 18

表格帖子(在iso中输出字符)

<form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">
Run Code Online (Sandbox Code Playgroud)

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

只是

<form id="leadform" method="post" action="{//app/path}">
Run Code Online (Sandbox Code Playgroud)

足够.


xml声明:

<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)

无关紧要.它仅与XML解析器相关.text/htmlWeb浏览器不会解析为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">
Run Code Online (Sandbox Code Playgroud)

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


元标记:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
Run Code Online (Sandbox Code Playgroud)

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


jvm参数:

-Dfile.encoding=UTF-8
Run Code Online (Sandbox Code Playgroud)

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


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

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


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

它依赖于HTTP响应头.

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

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

    <%@page pageEncoding="UTF-8" %>
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  3. 更改<Connector>条目Tomcat/conf/server.xml如下:

    <Connector (...) URIEncoding="UTF-8" />
    
    Run Code Online (Sandbox Code Playgroud)

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

也可以看看: