网络编程
位置:首页>> 网络编程>> JavaScript>> 客户端和服务端的编码“陷阱”(3)

客户端和服务端的编码“陷阱”(3)

作者:LuLi 来源:SimpleLife 发布时间:2007-12-21 19:19:00 

标签:乱码,编码,ajax,数据库

四、 特别留意AJAX这个数据入口

AJAX的流行让XMLHTTPRequest这个“数据入口”使用更频繁了,但遗憾的是XMLHTTPRequest对象本身没有像浏览器对Form的处理那么勤劳,同时它的无刷新特性让我们可以动态将服务端返回给我们的数据显示在当前已经被渲染过的页面内,相对于FORM这个数据入口,XMLHTTPRequest还存在一个“数据出口”的问题,因此这里的乱码现象更加频繁。

1、“数据入口”

一般情况下,XMLHTTPRequest发送的数据来源有两种:页面源码和XMLHTTPRequest所在的Javascript的文件源码。为何会将它们分开了?这里我们来假设几种不同情况:

• JS获取用户在表单元素中的输入数据,然后设置XMLHTTPRequest

在上文中已经提到了Form表单中数据的编码问题,用户输入的字符编码是和网页编码一致的,因此这里JS获取的数据编码和网页编码是一致的。

• JS源码中预设的数据

某些情况下,我们会将一些预定参数在程序中写死(这里就不要讨论程序扩展性了),那么这种情况的编码就得取决于文件编辑时编辑器输出字符的编码了。这就是我们的一个准则中建议的,你需要保持文件编码和字符编码的统一。JS本身是基于UNICODE编码的,所以这是我推荐文件用UTF-8编码的理由之一。

现在我们已经知道了XMLHTTPRequest发送的数据的编码,接着我们来看发送数据会出现什么问题。

XMLHTTPRequest不同于表单数据的发送,它不会给我们的数据做序列化,不会自动给我们做URL编码,也不能在客户端指定发送的编码类型。(PS:虽然setRequestHeader方法可以设置发送请求Header中的charset,不过我经过测试和对Header信息的监视,发现这个设置从Header中看是有效的,但服务端接收到的数据始终是UTF-8的,查了些资料没有找到原因在哪儿,暂且认为XMLHTTPRequest只能以UTF-8格式发送数据吧。但值得“庆幸”的是无论客户端的网页是什么编码,这里发送的UTF-8编码的数据都是正确转换过的,否则让我们自己在客户端写转换功能那就相当棘手了)为了保证数据send到服务端不出问题,我们只有自己动手做XMLHTTPRequest没有给我们完成的工作了。

• 指定请求Header中的content-type


  XMLHTTPRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); 

• 将序列化的数据进行URL编码


这里可以使用encodeURI和encodeURIComponent 
  这样以来,那么服务端就可以正确接收到我们POST过去的数据集了,这里需要注意,服务端得到的数据集是UTF-8格式的,是否做编码转换,那就是视你具体情况而定了。

2、“数据出口”

无论XMLHTTPRequest GET的是一个静态页面,还是一个动态页面,XMLHTTPRequest都不关心,它只关心responseText得到数据的编码,默认的编码是UTF-8,而这个编码是可以通过服务端直接设置的,这个在上文的指定网页编码中已经提到了。
  因此当你需要在页面显示responseText的内容时,你需要很清楚地知道页面的编码和responseText的编码,如果他们不统一,那乱码的麻烦就有出来了,不过现在你知道问题在哪儿了。

第四个原则:在使用AJAX时,尤其要注意数据流动中造成的编码类型改变。AJAX发送的是UTF-8编码,接收的编码默认是UTF-8,但允许服务端重新指定。

总结:避免乱码的最简洁方法就是系统中所有文本文件都统一使用最通用的编码,目前在WEB应用上当然是UTF-8了。但如果你目前的系统已经存在了编码不统一情况,或许上面的分析能帮你解决问题。

以上分析我的测试环境是IE6 、IE7、Firefox,有兴趣的话也可以动手测测,欢迎交流,如果有什么不当之处希望指出。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com