jquery的汉字问题

请问各位高手,为什么我用$.ajax返回汉字的时候都是乱码?编码是gb2312,

你的问题很简单,因为JQuery用AJAX来GET回一个页面时,responseText里面的中文多半会出现乱码,这是因为 xmlhttp在处理返回的responseText的时候,是把resposeBody按UTF-8编码机制进行解码造成的,如果服务器送出的确实是 UTF-8的数据流的时候汉字会正确显示,而送出了GBK编码流的时候就乱了。解决的办法就是在送出的流里面加一个HEADER,指明送出的是什么编码流,这样XMLHTTP就不会乱搞了。具体可以这样:
[code="java"]response.setHeader("Charset","GB2312");[/code]

用AJAX POST数据,是不能指定编码格式的,只能用utf-8,所以第一建议是前后台都统一用utf-8.

如果不能改变编码格式,就只能手工编码,把汉字用gbk编码后用urlencode方式发送出去。通常我们用vbscript做gbk编码(呵呵也就是Asc()啦),但是受到的限制是非IE浏览器不支持vbscript,而且在繁体中文系统下vbscript编码的结果似乎是big-5编码。

为了兼容繁体系统和非IE浏览器,也可以用javascript做gbk编码,这样基本上就要用字典法来编码了,因为unicode和gbk之间似乎没有简单的函数关系。javascript做gbk编码的方法可以参考 http://www.blogjava.net/emu/articles/31756.html

用escape/unescape也是可以考虑的方法,不过要注意escape的结果和urlencode的结果一样是用“%”作为转义符的,因此escape的结果如果要按照字符串形式接收的话“%”需要重新编码。

  1. 首先,基本上所有浏览器都是按照rfc等标准,优先考虑服务器端发送的content-type中所指定的encoding的,所以如果你要从服务器取得内容,尽量在服务器端指定好content-type。在这方面,Apache做的非常好。其默认设置上会为xxx.gb发送gb2312的头,为xxx.utf8发送utf-8的头,为xxx.big5发送big5的头。你甚至可以直接访问xxx,Apache会自动为浏览器选取最合适的版本发送。如果你使用Servlet/JSP开发,则使用Filter也可以非常简单的做到同样的事情。相对来说,IIS/ASP就很困难,ASP.NET应该有方法,但我不熟悉它,有熟悉的同志可作补充。

  2. 浏览器发送信息方面,笼统的说,参数会根据该页面本身的编码进行url编码(变成形如%xx%xx的形式)。细节如下,当网页编码是unicode时(utf-8或utf-16),一律采用utf-8并url编码发送。否则:FireFox根据网页的content-type所指定的编码对网页中的链接进行url编码;表单方面,FF支持html规范所规定的form上accept-charset属性,会根据该属性的第一个可用的编码进行编码,若无该参数则根据网页的content-type所指定的编码进行url编码。MS IE不支持accept-charset,仅根据网页的content-type所指定的编码对网页中的表单进行url编码;对于链接的url(不包含query部分)默认始终以utf-8进行url编码,但链接的query部分则不进行url编码直接以原始字节发送。正是这样不一致的行为造成很多麻烦。

  3. XMLHttpRequest发送时,你应该用encodeURI和encodeURIComponent方法对参数进行编码,这两个js函数始终使用utf-8进行编码。若不编码就传递的情况如何我没有测试过。

  4. BCP 最佳实践的建议

    a. 静态文件绝对不要用中文文件名,因为在不同操作系统上的不同server处理都不一样,而且可能存在bug(如iis)。

    b. html、css和js尽量采用带有BOM的utf-8。这样统一使用utf-8是最佳选择。

    c. 所有链接不应直接写中文,而应直接写成encodeURI之后的样子。

    d. 凡是涉及中文的表单,假如在一个非unicode的页面中,如果不是约定(如某个站点统一使用gb2312),则提交的时候最好以各种方式加上encoding的提示。例如加入额外的http头(如果可能的话),附带一个enc参数,提交到一个特别的地址(如xxx.action.gb)。。。总之给服务器端以提示。