JavaScript中对XMLRequest的responseBody进行解码 |
前面一篇日记学习了XMLHTTP的基本用法,用responseText其获得网页的内容如有Unicode字符的时候,则会显示乱码, 86jDY4 http://blog.numino.net/ R9Ji7h http://blog.numino.net/ 咋处理呢?这个时候还有另一个对象responseBody,看下它的运行结果: b4VwSs http://blog.numino.net/ 1n1iw4 http://blog.numino.net/ 这个结果……更不像话,原因是因为responseBody存储的是字节,如果用vbsEdit来调试VBS版的XMLHTTP的话,则可以在DEBUG界面看到responseBody中存储的一个个字节形字数据,问题就出在这里了,在VBS中,可以用midb,ascb等手段将字节正确地解码,方式如下: unE6ka http://blog.numino.net/ Set xml=CreateObject("msxml2.xmlhttp") M1QV5J http://blog.numino.net/ xml.open "get",url,False N7ivZU http://blog.numino.net/ xml.send uB0gzU http://blog.numino.net/ If xml.readyState=4 And xml.status=200 Then bfwH47 http://blog.numino.net/ 'WScript.Echo lenb(xml.responseBody) 7H2d89 http://blog.numino.net/ For i=1 To lenb(xml.responseBody) u1DCpP http://blog.numino.net/ curCode=ascb(midb(xml.responseBody,i,1)) 9UZXrM http://blog.numino.net/ If curCode<&h80 Then 1QZt87 http://blog.numino.net/ filContent=filContent & Chr(curCode) CC7871 http://blog.numino.net/ Else rRZiWx http://blog.numino.net/ nextCode=ascb(midb(xml.responseBody,i+1,1)) Nvz7Ox http://blog.numino.net/ filContent=filContent & Chr(CLng(curCode)*&H100+CInt(nextCode)) Zc0OX3 http://blog.numino.net/ :i=i+1 ITH0J9 http://blog.numino.net/ End If 3lYH2T http://blog.numino.net/ Next Zy1gY3 http://blog.numino.net/ End If 1AKjM8 http://blog.numino.net/ 可是这里的lenb、midb、ascb什么的函数,在javascript中貌似没有相应的方法啊,网上查了很多资料,对此都是一个回答:无法解决。目前使用的方法,都是折中的处理办法,比如引用adodb.stream来进行字节转码: m20Hbf http://blog.numino.net/ function BytesToBstr(body,Cset){ lWS0Kq http://blog.numino.net/ var objstream; 9W72PC http://blog.numino.net/ objstream = new ActiveXObject("adodb.stream"); G2iOLn http://blog.numino.net/ objstream.Type = 1; //处理字节流 UhPuCb http://blog.numino.net/ objstream.Mode =3; //读写模式 Xqd3Ts http://blog.numino.net/ objstream.open(); //打开对象 lU8Llb http://blog.numino.net/ objstream.write(body); //载入处理流 6pfH1Y http://blog.numino.net/ objstream.Position = 0; //指针指向开始 BI2zzE http://blog.numino.net/ objstream.Type = 2; //转换字符流处理 uQ5gxE http://blog.numino.net/ objstream.Charset = Cset; //设置字符集 YV1h5P http://blog.numino.net/ var str=objstream.ReadText(); //读取字符 0YUmF5 http://blog.numino.net/ objstream.close(); //关闭对向 P8Q5MH http://blog.numino.net/ return str; //返回字符串 CmZE1L http://blog.numino.net/ } Z8SQHv http://blog.numino.net/ 或者同一个网页中即使用vbscript函数,又使用javascript函数,将解码工作交给vbscript去做,然后javascript调用结果,没办法,谁叫javascript没有lenb,midb,ascb等牛叉的函数呢。 根据网上的一些例子改编的利用execScript混合vbscript片断的javascript解决办法。 O35Zrl http://blog.numino.net/ function getHTTPPage(sUrl){ 56k0Rh http://blog.numino.net/ var Http; 272K19 http://blog.numino.net/ var Http=new ActiveXObject("MSXML2.XMLHTTP") PdF6TX http://blog.numino.net/ Http.open("GET",sUrl,false); G6u1i0 http://blog.numino.net/ Http.send(); 86M72D http://blog.numino.net/ if(Http.readyState!= 4){ Z1taQe http://blog.numino.net/ return false; 32axuN http://blog.numino.net/ } 9Uhd0e http://blog.numino.net/ return gb2utf8(Http.responseBody); qXI92z http://blog.numino.net/ } jIzCCZ http://blog.numino.net/ function gb2utf8(data){ H2xgy8 http://blog.numino.net/ gb2utf8_data = data; GW5UN7 http://blog.numino.net/ execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript"); FCJQJ6 http://blog.numino.net/ var t=escape(gb2utf8_data).replace(/%u/g,""); 7O593I http://blog.numino.net/ t=t.replace(/(.{2})(.{2})/g,"%$2%$1");&nsp; 3a1Vne http://blog.numino.net/ t=t.replace(/%([A-Z].)%(.{2})/g,function(str){execScript("codeStr=chr("+eval(str.replace(/%(.{2})%(.{2})/g,"0x$1$2"))+")","VBScript");return codeStr}); 2QBVCE http://blog.numino.net/ return unescape(t); 3WYX5N http://blog.numino.net/ } XG6ASt http://blog.numino.net/ 看到这,忽然想想有没有javascript不利用外部工具来模拟vbscript的lenb,midb,ascb的实现呢,网上搜下关键字好象有人在提,先记录到这,如果能成,在把其间的两句execScript去掉,真正实现javascript解决这个问题。
|
|