被编码问题困扰了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端
使用下面的方法进行编码
<script language="javascript">
encodeURIComponent(escape(xxxxxxx));
</script>
asp端
Response.CodePage=936
Response.Charset="gb2312"
使用以下函数进行解码
<script language="javascript" runat="server">
function vbsunescape(source)...{
return unescape(source);
}
</script>
优点:近乎于完美解决乱码问题,包括发送和接收以及页面回显
缺点:
- 服务器端需要混用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" 使之成为全局函数。
以上二者结合即可完全搞定编码问题
更多的ASP下Ajax的GB2312编码问题请到论坛查看: http://BBS.TC711.COM
【 双击滚屏 】 【 评论 】 【 收藏 】 【 打印 】 【 关闭 】
来源:
互联网
日期:2008-10-7