关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法


Posted in Javascript onNovember 30, 2010

客户端是UTF-8编码,这也是现在大家公认的标准编码
在这种情况下,实用AJAX异步获取GB2312编码的服务器端信息时,不可避免的要遇到汉字乱码问题
因为目标数据是GB2312,但XMLHttpRequest默认是用UTF-8来进行数据封装的,因此会产生乱码
相信很多人都在用轻量级的JS工具集-prototype.js,它的AJAX功能同样很出色
我也一直在用它,因此对于这个问题也一直是基于 prototype.js来考虑的
但经过多次试验,还是没能把它返回的 responseText 转成正确的编码格式
后来了解到,在XMLHttpRequest对象的 responseBody 属性中,保存了原始的数据信息
但prototype.js的AJAX功能返回的 responseBody 属性是 undefined,看来还是要自己动手了
经过近一个小时的敲打,一个短小精悍的AJAX框架腾空出世了,哈哈,不过功能还是很全的
里面某些写法借鉴了另一个轻量级的AJAX框架-bingo.js的实现方式
调用方式及注释:

myAjaxCall({ 
url : 'xxxxx.jsp' //目标页面地址 
,params : URLEncoding('prm1=参数1&prm2=参数2') //参数串信息 
,method : 'POST' //发送方式POST or GET 
,callBack : retValue //回调函数名称 
,isBody : true //是否返回 responseBody ,默认返回 responseText 
//,isXml : false //是否以XML格式返回数据 
//,errorReport : false //发送错误时,是否弹出提示 
//,attachs : {} //附加的其他参数,可传递给回调函数 
}); 
function retValue(res,att){ 
var strRet = bytes2BSTR(res); 
alert(strRet); 
}

注意看其中的两个函数:

、URLEncoding :对参数进行编码
、bytes2BSTR :对返回的数据进行解码

这两个函数直接借鉴了网络上很流行的两个编码函数,不过都是用vbs写的
需要把这两个函数也附加到上面的页面里:

Function URLEncoding(vstrIn) 
strReturn = "" 
For i = 1 To Len(vstrIn) 
ThisChr = Mid(vStrIn,i,1) 
If Abs(Asc(ThisChr)) < &HFF Then 
strReturn = strReturn & ThisChr 
Else 
innerCode = Asc(ThisChr) 
If innerCode < 0 Then 
innerCode = innerCode + &H10000 
End If 
Hight8 = (innerCode And &HFF00) \ &HFF 
Low8 = innerCode And &HFF 
strReturn = strReturn & "%" & Hex(Hight8) & "%" & Hex(Low8) 
End If 
Next 
URLEncoding = strReturn 
End Function 
Function bytes2BSTR(vIn) 
strReturn = "" 
For i = 1 To LenB(vIn) 
ThisCharCode = AscB(MidB(vIn,i,1)) 
If ThisCharCode < &H80 Then 
strReturn = strReturn & Chr(ThisCharCode) 
Else 
NextCharCode = AscB(MidB(vIn,i+1,1)) 
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) 
i = i + 1 
End If 
Next 
bytes2BSTR = strReturn 
End Function

下面附上我写的轻量级Ajax框架 - myAjax.js 源码:
/** 
2 * myAjax 
3 * by netwild 
4 * netwild@163.com 
5 */ 
6 var myAjaxConfig = { 
7 "url":"" 
8 ,"params":"" 
9 ,"method":"GET" 
,"callBack":function(){} 
,"isXml":false 
,"isBody":false 
,"isCache":false 
,"errorReport":true 
,"statePoll":null 
,"postData":null 
,"attachs":{} 
}; 
function myAjaxCall(requestJson){ 
var attach; 
if(requestJson && typeof requestJson == "object"){ 
if(requestJson.url){myAjaxConfig.url = requestJson.url;} 
if(requestJson.params){myAjaxConfig.params = requestJson.params;} 
if(requestJson.method){myAjaxConfig.method = requestJson.method;} 
if(requestJson.callBack){myAjaxConfig.callBack = requestJson.callBack;} 
if(requestJson.isXml){myAjaxConfig.isXml = requestJson.isXml;} 
if(requestJson.isBody){myAjaxConfig.isBody = requestJson.isBody;} 
if(requestJson.isCache){myAjaxConfig.isCache = requestJson.isCache;} 
if(requestJson.statePoll){myAjaxConfig.statePoll = requestJson.statePoll;} 
if(requestJson.attachs){myAjaxConfig.attachs = requestJson.attachs;} 
} 
if(!myAjaxConfig.isCache){ 
var nocache = new Date().getTime(); 
if(myAjaxConfig.url.indexOf("?")>0){myAjaxConfig.url += "&nocache=" + nocache;} 
else{myAjaxConfig.url += "?nocache=" + nocache;} 
} 
var newCall = new myAjaxCore(); 
newCall.init(); 
} 
function myAjaxCore(){ 
var _self = this; 
var _state,_status; 
var _httpRequest,_attach; 
//////////////////////////////////////////////////// 
this.init = function(){ 
if (window.XMLHttpRequest){ 
_httpRequest = new XMLHttpRequest(); 
if (_httpRequest.overrideMimeType) { 
_httpRequest.overrideMimeType('text/xml'); 
} 
}else if (window.ActiveXObject) { 
var MSXML = ['MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP', 'Microsoft.XMLHTTP']; 
for(var n=0;n<MSXML.length;n++){ 
try { 
_httpRequest = new ActiveXObject(MSXML[n]); 
break; 
}catch(e){} 
} 
} 
with(_httpRequest) { 
onreadystatechange = _self.getResponse; 
open(myAjaxConfig.method,myAjaxConfig.url,true); 
if(myAjaxConfig.method == "POST" && (myAjaxConfig.params != "")){ 
setRequestHeader("Content-Length",myAjaxConfig.params.length); 
setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
send(myAjaxConfig.params); 
}else{ 
var textType = myAjaxConfig.isXml?"text/xml":"text/plain"; 
_httpRequest.setRequestHeader('Content-Type',textType); 
if(browser.IE){ 
setRequestHeader("Accept-Encoding", "gzip, deflate"); 
}else if(browser.FF){ 
setRequestHeader("Connection","close"); 
} 
send(null); 
} 
} 
}; 
//////////////////////////////////////////////////// 
this.getResponse = function(){ 
_state = _httpRequest.readyState; 
if(_httpRequest.readyState == 4 && _httpRequest.status){_status = _httpRequest.status;} 
if(myAjaxConfig.statePoll){myAjaxConfig.statePoll(_httpRequest.readyState);} 
if(_httpRequest.readyState==4 && _httpRequest.status>=400){ 
_self.abort(); 
_self.alertf("ERROR:HTTP response code "+_httpRequest.status); 
} 
if(_httpRequest.readyState==4 && _httpRequest.status==200){ 
var response_content; 
if(myAjaxConfig.isXML){ 
response_content = _httpRequest.responseXML; 
}else if(myAjaxConfig.isBody){ 
response_content = _httpRequest.responseBody; 
}else{ 
response_content = _httpRequest.responseText; 
} 
if(typeof myAjaxConfig.callBack == "function"){ 
myAjaxConfig.callBack(response_content,myAjaxConfig.attachs); 
}else{ 
eval(myAjaxConfig.callBack+"(response_content,myAjaxConfig.attachs)"); 
} 
} 
}; 
//////////////////////////////////////////////////// 
this.abort=function(){_httpRequest.abort();}; 
this.state=function(){return _state;}; 
this.status=function(){return _status;}; 
this.destory=function(){_self.abort();delete(_httpRequest);}; 
this.alertf=function(error){if(myAjaxConfig.errorReport){alert(error);}}; 
} 
if(!browser){ 
var browser={}; 
browser.IE = browser.ie = window.navigator.userAgent.indexOf("MSIE")>0; 
browser.Firefox = browser.firefox = browser.FF = browser.MF = navigator.userAgent.indexOf("Firefox")>0; 
browser.Gecko = browser.gecko = navigator.userAgent.indexOf("Gecko")>0; 
browser.Safari = browser.safari=navigator.userAgent.indexOf("Safari")>0; 
browser.Camino = browser.camino=navigator.userAgent.indexOf("Camino")>0; 
browser.Opera = browser.opera=navigator.userAgent.indexOf("Opera")>0; 
browser.other = browser.OT=!(browser.IE || browser.FF || browser.Safari || browser.Camino || browser.Opera); 
}
Javascript 相关文章推荐
javascript web对话框与弹出窗口
Feb 22 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
May 04 Javascript
javascript用户注册提示效果的简单实例
Aug 17 Javascript
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
javascript工厂方式定义对象
Dec 26 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
Oct 09 Javascript
七个不允许错过的jQuery小技巧
Dec 21 Javascript
javascript检查某个元素在数组中的索引值
Mar 30 Javascript
javascript 玩转Date对象(实例讲解)
Jul 11 Javascript
Koa项目搭建过程详细记录
Apr 12 Javascript
vue-cli和v-charts实现可视化图表过程解析
Oct 08 Javascript
原生js实现二级联动菜单
Nov 27 Javascript
学习面向对象之面向对象的术语
Nov 30 #Javascript
学习面向对象之面向对象的基本概念:对象和其他基本要素
Nov 30 #Javascript
基于JQuery的asp.net树实现代码
Nov 30 #Javascript
JQUERY设置IFRAME的SRC值的代码
Nov 30 #Javascript
juqery 学习之四 筛选过滤
Nov 30 #Javascript
juqery 学习之四 筛选查找
Nov 30 #Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
Nov 28 #Javascript
You might like
献给php初学者(入门学习经验谈)
2010/10/12 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
select组合框option的捕捉实例代码
2008/09/30 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
JavaScript中的比较操作符&gt;、=、
2014/12/31 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
jQuery操作css样式
2017/05/15 jQuery
vue实现提示保存后退出的方法
2018/03/15 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
python实现两个文件夹的同步
2019/08/29 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
师范应届生教师求职信
2013/11/05 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
Python中的嵌套循环详情
2022/03/23 Python
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python