更多相关内容...>>JavaScript中对XMLRequest的responseBody进行解码
JavaScript中对XMLRequest的responseBody进行解码
前面一篇日记学习了XMLHTTP的基本用法,用responseText其获得网页的内容如有Unicode字符的时候,则会显示乱码,
CN79Q9 http://blog.numino.net/

R2uvwE http://blog.numino.net/
咋处理呢?这个时候还有另一个对象responseBody,看下它的运行结果:
pFEn2Q http://blog.numino.net/

K4T9T4 http://blog.numino.net/
这个结果……更不像话,原因是因为responseBody存储的是字节,如果用vbsEdit来调试VBS版的XMLHTTP的话,则可以在DEBUG界面看到responseBody中存储的一个个字节形字数据,问题就出在这里了,在VBS中,可以用midb,ascb等手段将字节正确地解码,方式如下:
PpfV4e http://blog.numino.net/
Set xml=CreateObject("msxml2.xmlhttp")
UaOUNY http://blog.numino.net/
xml.open "get",url,False
mM0G7h http://blog.numino.net/
xml.send
H7g3Qc http://blog.numino.net/
If xml.readyState=4 And xml.status=200 Then
jtOfLp http://blog.numino.net/
'WScript.Echo lenb(xml.responseBody)
o1fojv http://blog.numino.net/
For i=1 To lenb(xml.responseBody)
EkkK7g http://blog.numino.net/
curCode=ascb(midb(xml.responseBody,i,1))
Eg98Na http://blog.numino.net/
If curCode<&h80 Then
wJKG1P http://blog.numino.net/
filContent=filContent & Chr(curCode)
rKkce4 http://blog.numino.net/
Else
0ET575 http://blog.numino.net/
nextCode=ascb(midb(xml.responseBody,i+1,1))
zRLo2o http://blog.numino.net/
filContent=filContent & Chr(CLng(curCode)*&H100+CInt(nextCode))
7k8YZ2 http://blog.numino.net/
:i=i+1
J7LPmX http://blog.numino.net/
End If
YC5M4t http://blog.numino.net/
Next
Wi8JHh http://blog.numino.net/
End If
LeLK9C http://blog.numino.net/
可是这里的lenb、midb、ascb什么的函数,在javascript中貌似没有相应的方法啊,网上查了很多资料,对此都是一个回答:无法解决。目前使用的方法,都是折中的处理办法,比如引用adodb.stream来进行字节转码:
28X7K0 http://blog.numino.net/
function BytesToBstr(body,Cset){
P3vVED http://blog.numino.net/
var objstream;
01vC9c http://blog.numino.net/
objstream = new ActiveXObject("adodb.stream");
a5EGB1 http://blog.numino.net/
objstream.Type = 1; //处理字节流
dikr8P http://blog.numino.net/
objstream.Mode =3; //读写模式
uh95vw http://blog.numino.net/
objstream.open(); //打开对象
n1wL6Q http://blog.numino.net/
objstream.write(body); //载入处理流
9EOmT5 http://blog.numino.net/
objstream.Position = 0; //指针指向开始
p89AQp http://blog.numino.net/
objstream.Type = 2; //转换字符流处理
07nTCn http://blog.numino.net/
objstream.Charset = Cset; //设置字符集
x7TuK6 http://blog.numino.net/
var str=objstream.ReadText(); //读取字符
6OI05J http://blog.numino.net/
objstream.close(); //关闭对向
FgL0lF http://blog.numino.net/
return str; //返回字符串
2U3w6M http://blog.numino.net/
}
qzTY7o http://blog.numino.net/
或者同一个网页中即使用vbscript函数,又使用javascript函数,将解码工作交给vbscript去做,然后javascript调用结果,没办法,谁叫javascript没有lenb,midb,ascb等牛叉的函数呢。 根据网上的一些例子改编的利用execScript混合vbscript片断的javascript解决办法。
5M53OW http://blog.numino.net/
function getHTTPPage(sUrl){
qDhuV9 http://blog.numino.net/
var Http;
753I0j http://blog.numino.net/
var Http=new ActiveXObject("MSXML2.XMLHTTP")
lpu57h http://blog.numino.net/
Http.open("GET",sUrl,false);
iac0LS http://blog.numino.net/
Http.send();
9kEiNH http://blog.numino.net/
if(Http.readyState!= 4){
iiKe0P http://blog.numino.net/
return false;
6K39Jy http://blog.numino.net/
}
s0Y9u9 http://blog.numino.net/
return gb2utf8(Http.responseBody);
H5v7lt http://blog.numino.net/
}
VHIHB2 http://blog.numino.net/
function gb2utf8(data){
SAqTZG http://blog.numino.net/
gb2utf8_data = data;
9Xb7n3 http://blog.numino.net/
execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");
9iD7ed http://blog.numino.net/
var t=escape(gb2utf8_data).replace(/%u/g,"");
VsQ7uM http://blog.numino.net/
t=t.replace(/(.{2})(.{2})/g,"%$2%$1");&nsp;
Lttrhs 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});
b2b2pg http://blog.numino.net/
return unescape(t);
G8f33A http://blog.numino.net/
}
9hILO7 http://blog.numino.net/
看到这,忽然想想有没有javascript不利用外部工具来模拟vbscript的lenb,midb,ascb的实现呢,网上搜下关键字好象有人在提,先记录到这,如果能成,在把其间的两句execScript去掉,真正实现javascript解决这个问题。
更多相关内容...>>JavaScript中对XMLRequest的responseBody进行解码

Bug报告 |  免责声明 |  联系我们 |  加入收藏

Copyright © 2006 NuminoStudio(www.numino.net) All Rights Reserved