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


客户端是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);
}



相关阅读:
document.open() 与 document.write()的区别
从手工注入看防御之Access
asp.net(c#)中取得文件物理路径
简单的加密css地址防止别人下载你的CSS文件的方法
ASP如何跳出本次进入下一次循环
深入分析“Oracle”并行处理的技术原理
javawscript 三级菜单的实现原理
Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
批处理 数码雨代码解释
Emm386、Lh、Memmaker命令使用说明
批处理BAT加强函数代码使用说明
Tech Ed 2008:HPC Server 2008讲解
JavaScript中创建新对象范例
JSP 中文字符处理代码
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 吕梁-无锡 羊者窝-芦沟 石家庄北-渠县 常州-白河东 沧州西-苍南 铜仁南-萧县北 芦台-正定 梅州-昆明 宜兴-天津 永和-上板城 完工-海拉尔 张掖-哈尔滨 辽中-潍坊 泉州-富源北 沈阳北-洛阳 常州北-锦州南 沈阳北-张家界 二道桥-昭通北 戚墅堰-衢州 常德-石家庄 文登-北京 信丰-蔡家坡 衡阳-营山 白奎堡-锦河 莆田-秦皇岛 武义北-义乌 刁家段-衙门庙 成都-丰都 绥中北-山海关 一步滩-宜宾 苏州-熊岳城 台州-水家湖 洪河-带岭 平房-双城堡 九三-亚布力 三门峡-阳新 孤山子-嘎什吐 赣州-桐乡 烟台-宿州东 六盘水-资阳 佛岭-桦林 锦州-杭州东 秦皇岛-平顶山西 艾河-云彩岭 孤山子-敖汉 绥中-汾阳 渭南-济宁 甘泉北-张桥 深州-山海关 渑池南-深圳北 班猫箐-茂舍祖 任丘-镇安 涵江-莆田 昌黎-兴国 临江场-朱杨溪 红旗营-穆棱 南杂木-蓝村 天义-石脑 遂溪-来宾 集宁南-珠斯花 芜湖-邳州 郑州-德阳 滦河-铁岭西 定西-靖州 朝阳-兴隆县 哈克-讷河 韶关东-镇江 一面坡-沈家 贵阳北-瓦屋山 成都-西安南 图强-阿木尔 张掖西-成都 瑞安-温岭 青岛北-淮北 滦平-通辽 大安北-普兰店 延吉-普兰店 汝州-株洲 徽县-玉门 安阳-徽县 菏泽牡丹节从列车火车站怎么去
重庆到浙江嘉兴最近的机场在哪里?
南汇去苏州的长途汽车是几点啊急求
现在从成都出发到马湖的路安全吗
从泉州到上海要多久坐汽车客车大约多少钱…希望我人帮帮忙,告
转让2011年1月27日福州到郑州的火车列车票一张。
听说十六号福州到光泽有列车火车了,是真的吗
西宁到西安一线的列车火车票价格是多少
浙江绍兴到山西长治有多少公里
请问从达州列车火车站如何到达县道让乡
青岛至成都列车火车
13路或107路到湘潭大学的运行时间,晚上到什么时候就没车了
即墨到城阳宝龙游乐园怎么坐车
庆阳有到榆林的长途客车吗
我想问一下,在春节期间,能在潍坊买到济南始发站的火车列车票吗
12月份去峨眉山耍,有几个问题想咨询一下,麻烦有知道的告知...
从武汉怎么到荆州啊
成都到重庆的火车票价钱数
自己驾车从花都到东莞谢岗镇怎么走
从河南漯河坐火车到江苏徐州要多久
广西钦州市详细资料
2011年春运买火车列车票(石家庄-昆明)难买吗
郑州哪个物流到宿迁市泗洪县
请问火车列车的d T K Z L 分别表示什么意思
镇江到溧阳的票价钱数,顺便问下天目湖有没有学生票,多少钱?谢谢
问路:天津市南开区鞍山西道时代公寓怎么坐车
梅州到金华的衢州是全程高速吗
南沙群岛问题
赣州到萍乡的客运汽车在萍乡的哪个站停
请问26号T126次火车南充到东莞东凌晨1点40分发车大概要坐多少小时 大概几点到

Copyright © 2016 phpStudy |