首先是需要知道的----数据流程:

浏览器先把要发送数据转换成二进制流,发送到服务器,二进制流的转换是根据编写html文档时其中的charset而定的,如gbk,gb2312,utf8
服务器接收二进制流后,根具请求头的编码编码格式(也就是html中的charset),进行一次解码,但对AJAX来说,请求头总是charset=utf8;

然后后台解析程序(如php)进行解析,后台根据响应头的编码格式,进行编码,转换成二进制流,发送给用户,用户浏览器根据html代码中的charset进行解码。

-----转码规则

如果用<from></form>发送数据“测试”,并且页面字体格式设置为charset=gb2312,你会看到url为  data.php?text=%B2%E2%CA%D4&submit=submit
如果用encodeURI编码会发现字符串“测试”编码后为%E6%B5%8B%E8%AF%95
用encodeURI和浏览器的编码结果不同,原因:encodeURI编码是以utf8格式编码,而<from>发送时,是浏览器根据请求头来编码,即本例中为gb2312编码格式

 

乱码解决方案:
前台两次encodeURI发送数据,前台一次decodeURI解码获取数据,

原因:后台服务器会根据请求头的charset设置自动进行一次解码(AJAX中charset为utf8),通过两次编码,可以使服务器对待特殊 字符等同与对待ASCII码,

不同编码格式对待ASCII码的二进制是相同的。

 

服务器端:若为php,设置header("charset=gb2312");若为xml,设置encoding="gb2312",

说明:服务器端的设置,主要是解决服务器端文本在用户浏览器的正常显示,因此它的设置是根据AJAX所在html的charset而定。

 

例如:
对待字符“测试” :发送字符(两次编码后):%25E6%25B5%258B%25E8%25AF%2595 ,后台字符:%E6%B5%8B%E8%AF%95;

返回服务器后用decodeURI解码后为“测试”

posted on 2010-05-04 18:20  progresstudy  阅读(2185)  评论(0编辑  收藏  举报