关于 Ajax Post 的乱码问题处理方法

来源:互联网 发布:宝元lnc编程 编辑:程序博客网 时间:2024/06/05 11:52

今天写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格式的。











0 0
原创粉丝点击