我有一个基于tomcat的应用程序,需要提交能够处理utf-8字符的表单。通过ajax提交时,数据会从utf-8中的getParameter()中正确返回。通过表单发布提交时,数据从iso-8859-1中的getParameter()返回。
我使用了提琴手,并且确定了请求中的 唯一 区别是 charset = utf-8 附加到了ajax调用中 Content-Type 标头的末尾(正如预期的那样,因为我明确地发送了内容类型)。
来自ajax的ContentType:“应用程序/ 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) { } });
表单发布(在iso中输出chars)
<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”); 并回显您发布的数据。 http://wiki.apache.org/tomcat/FAQ/CharacterEncoding
综上所述,尽管页面位于utf-8,指定utf-8的表单参数,xml声明或其他任何内容,但是post请求不会将字符集发送为utf-8。我花了三天的大部分时间来解决这个问题,但我的想法已经用完了。谁能帮我?
表单发布(在iso中输出chars) <form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8” method=”post” accept-charset=”utf-8” action=”{//app/path}”>
<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上则是多余的))。
text/html
Doctype: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<!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>。
<!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阀。
request.setCharacterEncoding("UTF-8");
仅在尚未解析请求正文时(即,您尚未调用getParameter()等),这才起作用。您需要尽早致电此电话。一个Filter是一个完美的地方。否则它将被忽略。
getParameter()
Filter
它取决于HTTP响应标头。
您需要做的是以下三件事:
<%@page pageEncoding="UTF-8" %>
这会将响应编码设置为UTF-8,并将响应标头设置为UTF-8。
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处理。