今天写JSP程序时遇到一件奇怪的事,在我的JSP页面和后台编码(包括Tomcat服务器的编码)都设置为 UTF-8 的情况下,使用Ajax 进行Post 操作时仍然出现了中文乱码的情况。
相关编码设置如下:
JSP页面:
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <Meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />myEclipse 编码设置:
Tomcat 编码设置:
前端进行post操作的代码如下:
var xhr = getXMLHttpRequest(); xhr.open("post","conne",true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded;"); xhr.send(value);
后台直接接收:
request.getParameter("value");
奇怪的事情就发生了,使用 Firefox 提交的数据确实是按中文显示的,但是 Chrome 浏览器提交的数据却是乱码。
于是我换了个方法,尝试在服务端使用:
String(request.getParameter("value").getBytes("ISO-8859-1"),"utf-8");结果 Chrome 浏览器提交的中文显示正常了,但是 Firefox 浏览器提交的中文却变成了乱码。问题看起来似乎和浏览器的默认编码有关系....
于是我参考一篇博客:http://www.cnblogs.com/qiuyi21/articles/1089555.html
这里的解决方法是:在客户端对上传的数据使用js 进行两重编码,然后在服务端只需要对数据进行一次解码操作即可。
代码如下:
客户端:
encodeURIComponent(encodeURIComponent(value));服务端:
URLDecoder.decode(request.getParameter("value"),"utf-8");问题解决了!
不过经过一番探索,我发现引起这个问题的关键原因并不在于浏览器,而是因为我的 Servelet 没有设置编码的缘故。
所以,只需要在 Servelet 的 doPost 函数中加一句:
request.setCharacterEncoding("utf-8");
感觉 Servelet 实质也相当于生成一个页面,如果没有指定编码的值,还是跑到默认的ISO-8859-1的编码上去了,所以此处指定之后,浏览器们就统一了。所以此处推荐这种方案。
另外根据我的经验,只要前台和后台同时使用UTF-8编码,一般是不会出现乱码问题的。而不是像某些教科书上写的非得手动将所有的编码的地方都硬改成“GB2312”或者“GBK”。事实上稍微懂一些编码的知识就会知道UTF-8编码其实是包含中文字符集的,而且它还支持多国语言和字符,扩展性和兼容性更好。我们平时在电脑上遇到的文件乱码问题多半都是 ANSI 编码惹的祸,不信你新建一个文本文档,然后点击“另存为”,看看它的编码是不是ANSI!一些编译器打开文件的时候按照UTF-8或者GBK等等其他默认编码打开就会出现乱码,所以建议必要的时候还是手动将文档另存为UTF-8格式的。
原文链接:https://www.f2er.com/ajax/163577.html