澳门新浦京8455comxmlhttp 乱码 比较完整的解决方法 (UTF8,GB2312 编码 解码)

代码如下:’//调换汉语为unicode functionUKugaLEncoding(vstrIn卡塔尔 dimi
dimstrReturn,ThisChr,innerCode,Hight8,Low8 strReturn=””
fori=1toLen(vstrIn卡塔尔(قطر‎ ThisChr=Mid(vStrIn,i,1卡塔尔(قطر‎ IfAbs(Asc(ThisChrState of Qatar卡塔尔&HFFthen
strReturn=strReturn&ThisChr else innerCode=Asc(ThisChr卡塔尔 IfinnerCode0then
innerCode=innerCode+&H10000 endIf Hight8=(innerCodeand&HFF00卡塔尔/&HFF
Low8=innerCodeand&HFF strReturn=strReturn&”%”&Hex(Hight8卡塔尔国&”%”&Hex(Low8卡塔尔endIf next URLEncoding=strReturn endfunction ‘//调换unicode到健康文本
functionbytes2BSTTucson(vIn卡塔尔(قطر‎ dimi dimstrReturn,ThisCharCode,nextCharCode
strReturn=”” fori=1toLenB(vIn卡塔尔国 ThisCharCode=AscB(MidB(vIn,i,1State of Qatar卡塔尔IfThisCharCode&H80then strReturn=strReturn&Chr(ThisCharCode卡塔尔 else
nextCharCode=AscB(MidB(vIn,i+1,1State of Qatar卡塔尔strReturn=strReturn&Chr(CLng(ThisCharCode卡塔尔国*&H100+CInt(nextCharCode))
i=i+1 endIf next bytes2BSTR=strReturn endfunction
functiongetText(oReq,url) onerrorresumenext ‘//创建XMLHTTP对象
ifoReqisnothingthen setoReq=CreateObject(“MSXML2.XMLHTTP”) endif
ifnotoReqisnothingthen oReq.open”get”,url,false oReq.send
ifoReq.status=200then getText=bytes2BSTR(oReq.responseBody) else
getText=”” endif else getText=”” endif endfunction

顾客端是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的贯彻情势
调用形式及注释:

用XMLHTTP Post Form时的表单乱码有双方面的来头——Post表单数据时普通话乱码;服务器Response被XMLHTTP不得法编码引起的乱码。换句话说,本文首要肃清八个难题——如何准确Post中文内容&怎么着正确显示获得的华语内容。

复制代码 代码如下:

Part I Post中文内容

myAjaxCall({
url : ‘xxxxx.jsp’ //指标页面地址
,params : U福特ExplorerLEncoding(‘prm1=参数1&prm2=参数2’State of Qatar //参数串消息
,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);
}

先看看E文的表单是怎么提交的:

专心相中间的五个函数:

复制代码 代码如下:

、UHavalLEncoding :对参数举办编码
、bytes2BST悍马H2 :对回到的数据开展解码

<SCRIPT language=”JavaScript”> 
strA = “submit1=Submit&text1=scsdfsd”; 
var oReq = new ActiveXObject(“MSXML2.XMLHTTP”); 
oReq.open(“POST”,”); 
oReq.setRequestHeader(“Content-Length”,strA.length);   
oReq.setRequestHeader(“CONTENT-TYPE”,”application/x-www-form-urlencoded”); 
oReq.send(strA); 
</SCRIPT> 

那多少个函数直接借鉴了网络上很盛行的八个编码函数,不过都以用vbs写的
亟需把那八个函数也增大到地方的页面里:

如果把strA = “submit1=Submit&text1=scsdfsd”;换成:
strA = “submit1=Submit&text1=中文”;

复制代码 代码如下:

您会发觉提交上去的东东一直不对,ASP中Request.Form(“Text1″)根本取不到值。我用Request.BinaryRead把三个HTML Form中的Post内容写出来看了看,才意识难点——Form提交时也要编码的,编码后的汉语是周围于%??%??的转义字符,比方“粤语”就被编码为:%D6%D0%CE%C4。呵呵,也怪我笨,人家CONTENT-TYPE里鲜明写的千载扬名——application/x-www-form-urlencoded,urlencoded嘛当然便是其相像子了。既然这样,那我们也晓得该如何是好了——自身做调换,代码见下:

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 源码:

<SCRIPT language=”VBScript”> 
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 

复制代码 代码如下:

strA = URLEncoding(“submit1=Submit&text1=中文”) 
oReq = CreateObject(“MSXML2.XMLHTTP”) 
oReq.open “POST”,” 
oReq.setRequestHeader “Content-Length”,Len(strA) 
oReq.setRequestHeader “CONTENT-TYPE”,”application/x-www-form-urlencoded” 
oReq.send strA 
</ScRIPT> 

/**
2 * myAjax
3 * by netwild
4 *
[email protected]
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的代码改成了VBScript,不是吃饱了撑的没事干,原因见后)

在此种状态下,实用AJAX异步获取GB2312编码的服务器端音讯时,不可制止的要碰着汉字乱…

Part II.精确呈现得到的中文内容

OK,假诺您在Server端把Form的源委写到数据库/文件的话,你在那见到的普通话毫无难题,然而,借令你想看看Server的Response——难题来了:假如Response的结果不是XML,XMLHTTP.responseXML里当然是不会有东东的,那就用responseText好了,在代码的尾声加一句:

alert(oReq.responseText)
走访大家辛苦劳动的结果  

唯独只是…..怎么具备的中文全改成了方格? (笔者打不出来,风趣味自身去试,也不用Post,Get一个含有汉语的网页就足以窥见了。)

案由相当粗略:XMLHTTP获得Response时假定Response是UTF8编码的,假如Response是XML,那还是能通过encoding来钦赐编码,但HTML就万分了。(见鬼的GB2312,再度打倒!)所以它把含GB2312编码的HTML当成UTF8格式,不出错才有鬼!

不过辛亏还应该有补救的不二等秘书籍:XMLHTTP的responseBody 属性里带有的只是未解码的Resonse——”a raw undecoded bytes as received directly from the server” :),唯一的标题是,responseBody再次来到的是一个unsigned bytes数组,大家怎么去访问它,怎么把它转变来BST奥迪Q5?

这就是为啥自个儿在上头把代码改成VBScript的因由——VBScript Can do it,but JavaScript Cannot!

代码见下:

复制代码 代码如下:

<SCRIPT language=”VBScript”> 
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 

strA = URLEncoding(“submit1=Submit&text1=中文”) 
oReq = CreateObject(“MSXML2.XMLHTTP”) 
oReq.open “POST”,” 
oReq.setRequestHeader “Content-Length”,Len(strA) 
oReq.setRequestHeader “CONTENT-TYPE”,”application/x-www-form-urlencoded” 
oReq.send strA 
alert bytes2BSTR(oReq.responseBody) 
</SSRIPT>

您可能感兴趣的小说:

  • Java在web页面上的编码解码管理及普通话U路虎极光L乱码驱除
  • escape编码与unescape解码汉字现身乱码的缓慢解决措施
  • PHP
    base64编码后解码乱码的化解办法
  • XMLHTTP 乱码的解决措施(UTF8,GB2312 编码
    解码)
  • 浅谈编码,解码,乱码的题目
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图