使用ajax的人,最头疼的莫过于处理返回的中文乱码问题。如果可以在服务器进行操作的话,这个问题并不复杂。问题是有时候我们没有在服务器端进行操作的权利。例如,你想获取的是新浪的首页。你唯一能做的就是在客户端进行处理。
xmlhttp返回的对象可以是:responseText,responseXML和responseBody。其中responseText和responseXML是按照UTF-8的编码方式去抓取目标页面。responseBody返回的是目标页面的二进制数据流。对于那些不是以UTF-8编码的目标页面,我们是无法通过使用responseText,responseXML这两种方式获取无乱码的中文页面的。这时我们可以通过responseBody方式返回目标页面的二进制数据流,然后对数据流进行客户端的转化就可以。下面是我在网上找到的分别用vbscript和javascript解决这个问题的方法。
<script language="VBScript">
function bin2str(bin)
dim tmp,ustr
tmp=""
for i=1 to LenB(bin)-1
ustr=AscB(MidB(bin,i,1))
if ustr>127 then
i=i+1
tmp=tmp&chr(ustr*256+AscB(MidB(bin,i,1)))
else
tmp=tmp&chr(ustr)
end if
next
bin2str=tmp
end function
</script>
<script language="javascript">
var adTypeBinary = 1
var adTypeText = 2
function bytes2bstr(vin){
var st = new ActiveXObject("adodb.stream")
with (st){
Type = adTypeText
Open()
WriteText(vin)
Position = 0
Charset = "GB2312"
Position = 2
return ReadText
}
}
</script>
下面是我成功解决该问题的完整文件
<html>
<head>
<title>ajax encoding</title>
<script language="javascript" type="text/javascript">
var xmlhttp;
function CreateXMLHttpRequest() {
xmlhttp=false;
if(window.XMLHttpRequest) {
xmlhttp=new XMLHttpRequest();
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType('text/xml');
}
} else if(window.ActiveXObject) {
try{
xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) { }
}
}
}
function load() {
CreateXMLHttpRequest();
if(!xmlhttp) {
document.getElementById("error").innerHTML="对不起,服务器有故障,不能传送数据!";
return false;
} else {
xmlhttp.onreadystatechange=process;
URL="http://www.sina.com.cn/";
xmlhttp.open('post',URL,false);
xmlhttp.send(null);
}
}
function process() {
if(xmlhttp.readyState==4) {
if(xmlhttp.status==200) {
var info = gb2utf8(xmlhttp.responseBody);
document.write(info);
} else {
alert(xmlhttp.status);
}
}
}
function gb2utf8(data){
var glbEncode = [];
gb2utf8_data = data;
execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");
var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/g,"@$1$2");
t=t.split("@");
var i=0,j=t.length,k;
while(++i<j) {
k=t[i].substring(0,4);
if(!glbEncode[k]) {
gb2utf8_char = eval("0x"+k);
execScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript");
glbEncode[k]=escape(gb2utf8_char).substring(1,6);
}
t[i]=glbEncode[k]+t[i].substring(4);
}
gb2utf8_data = gb2utf8_char = null;
return unescape(t.join("%"));
}
</script>
</head>
<body onload="load()">
<div id="error"></div>
</body>
</html>