曲同学昨天问我一XMLHttp读取显示中文的问题,今天找了下资料。
折腾了一下午,才搞定,记下。
问题是这样的:
用XMLHttp读取别人的网页,由于国内很多人把网页的编码设为GB2312,或其
他不与UTF-8兼容的编码方式,而XMLHttp的默认编码方式为UTF-8,导致读取的
中文内容不能正常被显示。
解决:
写一转码函数,先对读出的内容进行转码,然后再进行显示或者其他处理。
网上多数解决方案是VBScript实现的,唯一一套JAVAScript的函数,也调用了VB的处理,
好像是因为JAVAScript里没有实现字符和内码的转换。
这里有一点问题,转码responseBody的时候,没有问题,
这里用的是responseBody,因为responseBody是未解码的二进制数据,而responseText是
但是转码responseText的时候却报了脚本错误。可能因为responseText作为网页返回的
信息,里面有个别的字符的转码有问题。
解码后的字符串,而xmlhttp默认解码方式为utf-8字符集,对于没有指定返回数据编码的页面,
就会出现中文解码为乱码的情况。指定返回编码的方法:
PHP:header('Content-Type:text/html;charset=GB2312');
ASP:response.Charset="GB2312"
JSP:response.setHeader("Charset","GB2312");
这样,responseText的数据中的中文应该就能正确解码了。
(还没有进行服务器端测试)
测试结果见后续篇
引申问题:
使用XMLHttpRequest来POST带有中文的数据到其他非UTF-8编码的动态页面时,也会有问题,还没解决,解决以后再写一篇。
测试环境为:Windows XP + IE6.0
测试代码:
< head >
< title ></ title >
< meta http-equiv ="Content-Type" content ="text/html; charset=gb2312" >
< script language ="javascript" > ... ...
var xmlHttp;
//JavaScript转码函数
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("%"));
}
function CreateXmlHttp()
......{
if(window.ActiveXObject)
......{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)
......{
xmlHttp = new XMLHttpRequest();
}
}
function startRequest()
......{
var ipp = document.getElementById("ipbox").value;
//使用GET方法
var url = "http://www.kiees.com/ip.asp?ip="+ipp;
CreateXmlHttp();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
//*************使用POST方法****************
//*****************************************
//var url = "http://www.kiees.com/ip.asp";
//var content="ip="+ipp;
//CreateXmlHttp();
//xmlHttp.onreadystatechange = handleStateChange;
//xmlHttp.open("POST",url,true);
//xmlHttp.setRequestHeader("Content-Length",content.length);
//xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
//xmlHttp.send(content);
//*****************************************
}
function handleStateChange()
......{
if(xmlHttp.readyState == 4)
......{
if(xmlHttp.status == 200)
......{
var rt = xmlHttp.responseBody;
//使用JavaScript函数
document.getElementById("lt").innerText =gb2utf8(rt);
//*************使用VbScript函数****************
//*********************************************
//document.getElementById("lt").innerText =convertstr(rt);
//*********************************************
}
}
}
</ script >
< script language ="VBScript" > ... ...
'VbScript转码函数
Function convertstr(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
convertstr = strReturn
End Function
</ script >
</ head >
< body >
< form >
请输入IP: < input name ="ipbox" id ="ipbox" type ="text" maxlength ="15" /> < input type ="button" value ="查询" onclick ="startRequest();" />
< div id ="lt" >
</ div >
</ form >
</ body >
</ html >