Showing posts with label 中文乱码. Show all posts
Showing posts with label 中文乱码. Show all posts

Thursday, January 13, 2011

springmvc 中ajax提交发生乱码问题

这个问题目前只是在springmvc项目中碰到,在IE和Chrome中,当用jQuery.post()方法发起ajax请求时,Controller中收到的中文内容变成乱码了,而在firefox中用jQuery.post()进行ajax请求时是正常的。
在Controller中调用如下代码(项目为UTF-8编码):


// name 是post收到的字符串变量名
System.out.println(new String(name.getBytes(HTTP.ISO_8859_1), HTTP.UTF_8));

可以看到乱码恢复正常,说明IE和Chrome提交的ajax请求中的内容被编码成 ISO-8859-1 编码了。
而实际上,对于IE而已,所有的ajax请求都是以UTF-8方式发起的,通过以下方式设置ajax请求的编码为GBK实际是没有用的,服务器收到仍然是UTF-8编码的请求体:

xmlhttp.setRequestHeader( "Content-Type", "text/html;charset=GBK" );
// or
xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded; charset=GBK");

因此可以肯定是springmvc在收到POST请求后,将请求体的数据用 ISO-8859-1 编码来处理了,最后传到Controller中时变成了乱码,但是为何firefox中提交的却仍然是正确的呢?
在firebug中观察firefox中的ajax请求头,可以看到firebug中的提示:

Content-Type application/x-www-form-urlencoded; charset=UTF-8

而在IE中用http analysis工具看到的却是:

Content-Type application/x-www-form-urlencoded

google Chrome中与IE一样,ajax请求头中没有指明编码,所以Chrome和IE一样将发生乱码了。
查看jquery-1.4.4.js源码可以看到,jQuery中原来的 contentType设置为"application/x-www-form-urlencoded",IE和Chrome中的请求头显示是正确的,没有问题,反而是firefox将contentType中设置了编码。
从这个请求头分析来看,应该是springmvc没有得到请求的编码,而将其内容设置为ISO-8859-1了,因此发生了乱码的情况。

解决方法还是参考firefox的请求头,在contentType中指定编码,明确告诉服务器端,当前请求体的编码方式为UTF-8。

xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

如果使用jQuery发起ajax请求,javascript的代码改为如下方式发起ajax请求,而不是以$.post()和$.get()等快捷方法:

$.ajax({
url: url,
type: "POST",
dataType: "html",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
data: data,
complete:function(data) {
}
});

Sunday, May 25, 2008

MacBook 中 FIREFOX2 中文网页乱码及掉字问题解决方法

中文乱码主要原因是因为安装了OFFICE 2008对SIMSUN字体产生冲突,FIREFOX 3就没有这个问题。
FIREFOX 2下的解决方法就是在FONT BOOK中把SIMSUN这个字体先禁用掉。如果按下面修改了2个自定义的css文件,指定firefox的渲染字体,那么就不需要去禁用SIMSUN字体了。
可以打开http://www.163.com看一下是否正常。

在 firefox2 中还有一个就是在input框中输入的中文掉字和光标错位的问题,比如在google搜索框里输入"暂停删除"这四个字就可看得到。
这个需要修改一下 firefox2 的渲染css文件:
默认的目录是 ~/Library/Application Support/Firefox/Profiles/xxxxxxxx.default/chrome/
下面原来有2个example.css文件,对应的生成userChrome.css 和 userContent.css 这2个文件,并在这二个文件中都加入一个css定义:


* {
font-family: Lucida Grande, 华文黑体;
}

需要注意的是,一定要把文件保存为 UTF-8 格式。Lucida Grande 和华文黑体,都是苹果的默认字体,也是 Safari 默认字体。

Reference: http://www.wpdr.net/forums/showthread.php?t=3287
http://hi.baidu.com/dawgdash/blog/item/6157a138c501b227b8998ff1.html