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对象传回的中文数据中出现乱码?    在使用AJAX进行网站开发的时候,我们都使用XMLHttpRequest对象来传递数据,由于用户机器使用的操作系统和浏览器...

XMLHttpRequest对象解决中文乱码问题

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

XMLHttpRequest进行ajax通讯时中文乱码问题解决

 使用js调用XMLHttpRequest进行ajax通讯时,如果服务器端要传递的数据中有中文时,我们的解决办法。 1、页面:     一般在页面我们为了方便,最好使用UTF-8编码。 2、服务器端:...

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

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/1999/xhtml">>    如何解决XmlH...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

xmlhttp中文乱码之客户端解决方案

xmlhttp中文乱码之客户端解决方案 2006-10-23 01:45使用ajax的人,最头疼的莫过于处理返回的中文乱码问题。如果可以在服务器进行操作的话,这个问题并不复杂。问题是有时候我们没有在服...
  • smeyou
  • smeyou
  • 2011年06月10日 12:07
  • 2506

如何解决XMLHTTP提交过时返回的是乱码?

如何解决XMLHTTP提交过时返回的是乱码?下面是解决办法:1,测试从服务器返回含有中文的 XML 字符串,使用 GET 方法来进行测试。2,把含有中文字符串的 XML 提交到服务器,并在服务器进行处...

关于在AJAX中GET回的ResponseText中文乱码的最简解决办法

关于在AJAX中GET回的ResponseText中文乱码的最简解决办法 ...

史上最全的AJAX之XMLHttpRequest方法和属性详解

转载请标明出处 本文出自HCY的博客 概述AJAX是“Asynchronous Javascript And XML”的缩写,中文译作“异步JavaScript和XML”。使用AJAX可以通...

JavaScript中解决Microsoft.XMLHTTP乱码的最简单方法

环境:JavaScript 作为脚本语言的 ASP,也可扩展到客户端的 JavaScript。以下函数为自定义组件 bluec.bluecData2 的代码:function execSql(pSql...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XMLHttpRequest读取中文网页时返回乱码的解决办法
举报原因:
原因补充:

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