被编码问题困扰了1天了,找到了几个解决方案,虽然问题没有最终解决,但可以为以后编写ajax应用提供一些参考。
废话少说,先简要描述一下问题所在:
JS 内部使用UTF-8 编码,本身js用GB2312书写。ASP 输出使用GB2312,Codepage = 936
JS -> ASP ,escape后的程序以utf-8编码发送给asp,asp端必须进行编码转换。
ASP -> JS ,asp输出的编码为gb2312,js默认以UTF-8接收并显示。可以用Js的GB2UTF8函数在客户端进行编码转换。转换后之前js提交的utf8参数乱码,asp内部的中文字符串正常显示
解决方案如下:
1. 服务器端纯用utf-8编码,设置response.contentType="text/html;charset=utf-8" 并且设置html页面的meta头为utf-8编码。js端使用escape或者encodeURIComponent 对参数进行编码均可。
优点:不用再被编码问题困扰
缺点:
- asp调试比较痛苦,输出的asp错误均为gb2312编码……在utf-8页面上显示乱码。
- 如果是在原有的系统上修改,凡是含有中文字符变量的包含文件,都必须以utf-8另存一份出来
2. 搜到的一个还不错的方法。但是仍然因为往现有的系统中套用麻烦而舍弃。引用自 http://www.dc9.cn/post/295.html
js端
使用下面的方法进行编码
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
asp端
Response.CodePage=936
Response.Charset="gb2312"
使用以下函数进行解码
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
优点:近乎于完美解决乱码问题,包括发送和接收以及页面回显
缺点:
- 服务器端需要混用javascript编码,服务器端程序效率低
- 每个参数都需要使用 vbsundescape 转换一次
这样就已经基本可以了。
小结:
以上两种方法均不适合现有系统的改造……于是决定放弃ajax计划……
后记:
最后还是找到了方法,虽然有点衰~
1. 关于asp->js输出乱码问题:
因为对于xml,XMLHttp可以根据其指定编码自动转换,所以就利用这个来做。在asp页面清除掉原来的信息输出,改为:
< %
response.codepage = " 936 "
response.ContentType = " text/xml;charset=gb2312 "
response.charset( " gb2312 " )
Response.Clear
%><?xml version="1.0" encoding="GB2312"?>
<Contents>
<Content>
<![CDATA[
尾部添加:
]]>
</Content>
</Contents>用XMLHttpRequest.responseXML获取得到的数据, XHR.responseXML.selectSingleNode("Contents/Content") 下的第一个nodeType==4 的 childNode 的nodeValue就是返回的代码……用什么套都无所谓了现在……关于查找这个CDATA区块的方法,从XPath里可能还有更好的方法,现在暂用程序循环获得:
for ( var i = 0 ;i < content.length;i ++ )
if (content[i].nodeType == 4 ) ... {result = content[i].nodeValue;}
![]()
2. 关于提交的乱码问题:
之前一直依赖于使用的MochiKit框架的queryString方法。后将其修改,在 MochiKit/Base.js 中 862行的 queryString函数复制为queryString2 ,修改 892 行 的 rval.push中 的 urlEncode 为 escape 即可。并在大约1000行左右的 MochiKit.Base.EXPORT 数组中的适当位置添加 "queryString2" 使之成为全局函数。
以上二者结合即可完全搞定编码问题