我有一个基于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声明或其他任何内容.我已经花了三天的时间来完成这项工作,但我的想法已经不多了.谁能帮我?
我的Java webapp中存在问题.
这是index.jsp中的代码:
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<% request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<form action="index.jsp" method="get">
<input type="text" name="q"/>
</form>
Res: <%= request.getParameter("q") %>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当我发送请求时,我的浏览器发送此标头:
GET /kjd/index.jsp?q=%C3%A9 HTTP/1.1\r\n
...
Accept-Charset: UTF-8,*\r\n
Run Code Online (Sandbox Code Playgroud)
Tomcat服务器将此返回给我:
Content-Type: text/html;charset=UTF-8\r\n
Run Code Online (Sandbox Code Playgroud)
但是如果我在表单中发送"é"(在UTF-8中为%C3%A9),则会显示"é".
我的理解是浏览器发送一个用UTF-8(%C3%A9)编码的"é".
但是服务器将其解释为ISO-8859-1.所以%C3被解码为Ã而%A9被解码为©,然后发回以UTF-8编码的响应.
在代码中,请求应使用UTF-8解码:
request.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)
但是,如果我发送此网址:
http://localhost:8080/kjd/index.jsp?q=%E9
Run Code Online (Sandbox Code Playgroud)
"%E9"用ISO-8859-1表示,显示"é".
为什么这不起作用?为什么请求使用ISO-8859-1进行解码?
我在Tomcat 6和7以及Windows和Ubuntu上尝试过它.
经过大量的反复试验,我仍然无法弄清楚问题.JSP,servlet和数据库都被设置为接受UTF-8编码,但即使我在任何具有任何双字节字符的东西上使用request.getParameter,如em dash,它们也会被破坏为字符.
我已经手动提交数据库,它能够接受这些字符,没问题.如果我从servlet中的数据库中提取文本并将其打印在我的jsp页面的表单中,则显示没有问题.
唯一一次,当我尝试在使用request.getParameter检索它之后尝试将其显示在其他地方时,它发现它作为已损坏的字符返回.
有没有其他人有这个问题?我该如何解决?
我有一个来自应用程序的以下字符串:
Hotel “Lowest Rate Guaranteed” Terms and Conditions
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下行替换上述语句中的双引号:
Tempdata = Tempdata.replace("\"", "");
System.out.println(Tempdata);
Run Code Online (Sandbox Code Playgroud)
它不起作用并且总是返回相同的值,但是如果我手动删除上面的双引号并手动输入双引号并尝试相同的命令,它可以正常工作。
手动替换双引号后,字符串看起来像
Tempdata = Tempdata.replace("\"", "");
System.out.println(Tempdata);
Run Code Online (Sandbox Code Playgroud)
我们可以看到双引号有细微的差别。看起来来自应用程序的双引号是 utf-8。
感谢任何帮助。谢谢