XMLHttpRequest读取中文网页时返回乱码的解决办法

转载 2006年05月26日 13:49:00

XMLHttpRequest读取中文网页时返回乱码的解决办法

XMLHttpRequest 默认是用UTF-8 传递数据。当服务端的返回数据是UTF-8编码的时候,它工作得很好(开发web应用,当服务端和客户端以及数据库统一使用UTF-8编码可以有效的避免乱码问题)。如果服务端设置了正确的Content-Type Response Header以及编码信息,那么XmlHttpRequest也可以正确工作。

可是当使用XMLHttpRequest读取中文网页内容时, 如果服务端的程序没有设置Content-Type Response Header,或者Header没有设置编码类型,那么我们访问responseText属性的时候就可能遭遇乱码。如以下代码用XMLHttpRequest获取雅虎中国网站的星座站首页:

xmlhttp = getXMLHttpRequest();
var url = "http://cn.astrology.yahoo.com/";
xmlhttp.open("GET", url, true);
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4)
    if (xmlhttp.status == 200)
        alert(xmlhttp.responseText);
};
xmlhttp.send(null);

纵使yahoo中国这样专业的网站,对web标准的支持还很不彻底,弹出的html源码中充斥不符合web标准的html标签,当然还有已预见的乱码。

同样遗憾的是,FireFox 和 IE 的解决方法也是南辕北辙

FireFox

FireFox 的XMLHttpRequest对象支持overrideMimeType方法,可以指定返回数据的编码类型,利用该方法可以解决中文乱码,前面的代码修改如下:

xmlhttp = getXMLHttpRequest();
var url = "http://cn.astrology.yahoo.com/";
xmlhttp.open("GET", url, true);
xmlhttp.overrideMimeType("text/html;charset=gb2312");//设定以gb2312编码识别数据
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4)
    if (xmlhttp.status == 200)
        alert(xmlhttp.responseText);
};
xmlhttp.send(null);

Internet Explorer

IE不支持overrideMimeType方法,并且只能用一种很蹩脚的方法来解决,此时需要引入一个杂交的函数:

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("%"));
}

xmlhttp = getXMLHttpRequest(); var url = "http://cn.astrology.yahoo.com/"; xmlhttp.open("GET", url, true); xmlhttp.onreadystatechange = function(){ if (xmlhttp.readyState == 4) if (xmlhttp.status == 200) alert(gb2utf8(xmlhttp.responseBody)); //注意这里要用responseBody }; xmlhttp.send(null);

gb2utf8函数直接解析XMLHttpRequest返回的二进制数据,其中要利用execScript方法来执行VBScript的函数。所以说是一个杂交的函数。感谢>>blueidea论坛 提供的算法。

虽然有了解决的办法,但形式丑陋,而且不符合web标准。所以应该在编程中尽量避免,如果是开发web应用,应尽量使用UTF-8编码,或者在服务端设置正确的编码信息。至于以上范例,有盗取其他网站内容的嫌疑,更是不为提倡。

相关文章推荐

XMLHttpRequest 传递中文 乱码

在浏览器端使用XMLHttpRequest对象向服务器端传送中文参数,如果不在浏览器端和服务器端进行处理时,会出现中文乱码问题.针对这种问题,有很多的解决办法,但往往都是在IE下可以正常显示中文,在其...

XMLHttpRequest对象解决中文乱码问题

在学习ajax中XMLHttpRequest对象扩展问题中,XMLHttpRequest可以用来解决web访问中文乱码问题,对此作出总结。   出现乱码的原因:  (1)请求数据中包含中文,服务器端程...

JS请求服务器gbk文件乱码问题

JS获取服务器编码格式为gb2312的文件时内容为乱码,ajax网络请求内部使用的是XMLHttpRequest,所以在请求之前需要设置一下编码格式,但是设置xhr.setRequestHeader(...

XMLHttpRequest 传递中文 乱码

在浏览器端使用XMLHttpRequest对象向服务器端传送中文参数,如果不在浏览器端和服务器端进行处理时,会出现中文乱码问题.针对这种问题,有很多的解决办法,但往往都是在IE下可以正常显示中文,在其...

解决XMLHttpRequest中文乱码问题

通过XMLHttpRequest获取的数据,默认的字符编码是UTF-8,如果前端页面是GB2312或者其它编码,显示获取的数据就是乱码。通 过XMLHTTPRequest,POST的数据也是UTF-...

如何防止XMLHttpRequest对象传回的中文数据中出现乱码? 

如何防止XMLHttpRequest对象传回的中文数据中出现乱码?    在使用AJAX进行网站开发的时候,我们都使用XMLHttpRequest对象来传递数据,由于用户机器使用的操作系统和浏览器使用...

从XMLHttpRequest请求响应里getResponseHeader(header)报错:Refused to get unsafe header "**" 问题解决

问题产生原因: 原因1:W3C的 xhr 标准中做了限制,规定客户端无法获取 response 中的 Set-Cookie、Set-Cookie2这2个字段,无论是同域还是跨域请求; ...
  • iuoon
  • iuoon
  • 2016-12-16 13:29
  • 3468

如何解决XmlHttp.responseText的乱码问题

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/1999/xhtml">>    如何解决XmlH...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)