我有一个基于tomcat的应用程序需要提交一个能够处理utf-8字符的表单。通过ajax提交时,数据从utf-8中的getParameter()正确返回。通过表单发布提交时,数据将从iso-8859-1中的getParameter()返回。
我使用了fiddler,并确定了请求中仅的差异,是 charset = utf-8 附加到内容的末尾 - 在ajax调用中键入标头(正如预期的那样,因为我明确地发送了内容类型)。
来自ajax的ContentType: “application / x-www-form-urlencoded; charset = utf-8”
表单中的ContentType: “应用程序/ x 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) {
}
});
表格帖子(在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声明或其他任何内容。我已经花了三天的时间来完成这项工作,但我的想法已经不多了。任何人都可以帮助我吗?
答案 0 :(得分:18)
表格帖子(在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解析器相关。 Web浏览器不会将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响应头中的那个。如果您没有使用像Facelets或JSPX这样的基于XML的视图技术,那么<!DOCTYPE html>
就可以了。
元标记:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
无关。仅在从本地磁盘查看HTML页面或在本地解析HTML页面时才有意义。相反,将使用HTTP响应头中的那个。
jvm参数:
-Dfile.encoding=UTF-8
无关。它只与Sun / Oracle(!)JVM有关,可以解析源文件。
我也试过使用
request.setCharacterEncoding("UTF-8");
,但似乎tomcat只是忽略了它。我没有使用RequestDumper阀门。
这仅在尚未解析请求正文时才有效(即您尚未事先调用getParameter()
等)。你需要尽早打电话。 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。
答案 1 :(得分:1)
试试这个:
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
有关详细信息,请参阅以下网址 http://wiki.apache.org/tomcat/FAQ/CharacterEncoding
答案 2 :(得分:0)
你试过accept-charset="UTF-8"
吗?如你所说,数据应该根据页面本身的编码进行编码; tomcat忽略了这一点似乎很奇怪。您正在尝试使用哪种浏览器?
答案 3 :(得分:0)
您是否尝试在useBodyEncodingForURL="true"
中为HTTP连接器指定conf/server.xml
?
答案 4 :(得分:0)
我根据this post中的信息实施了一个过滤器,现在它正在运行。但是,这仍然无法解释为什么即使页面是UTF-8,tomcat用来解释它的字符集也是ISO-9951-1。