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

AJAX技术使用XMLHttpRequest对象传递参数的中文乱码问题 立即下载

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的函数。所以说是一个杂交的函数。感谢500){this.resized=true;this.style.width=500;}">>" src="http://ajaxcn.org/theme/images/Icon-Extlink.png" border=0>blueidea论坛 提供的算法。

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

xmlhttp 乱码 比较完整的解决方法 (UTF8,GB2312 编码 解码) 立即下载

相关推荐

从零到一:AIC8800 USB-WiFi模块在Linux内核6.x下的驱动适配与避坑指南

本文详细介绍了AIC8800 USB-WiFi模块在Linux内核6.x下的驱动适配全流程,包括环境准备、源码编译、内核API变更处理及常见问题解决方案。重点针对驱动适配中的符号导出、设备ID识别和固件加载等核心挑战提供实用指南,帮助开发者高效完成硬件驱动兼容性调试。

k8l9m0n的博客 1025

XMLHttpRequest中文乱码

XMLHttpRequest中文乱码。

merlon学习笔记 1009

【GAMES201学习笔记】物质点法入门

《GAMES201》 学习笔记

捕鱼维的个人小站 9199

抓取html 中文乱码,利用代码抓取网页数据,出现中文乱码问题

嗯,多谢你解答。试验了,出现了另外一种乱码,自己又再次琢磨了http://club.excelhome.net/thread-893760-1-1.html这个帖子的第一帖,问题解决了,原因是'因为XMLHTTP默认是UTF-8(原网页正是 此编码格式),不能识别gb2312,会发现数据乱码,所以不能采用.responsetext对象来得到字符串。Sub te4t()Dim strRespText...

weixin_39980184的博客 570

无人机通信电台--XBee-PRO 900HP (S3B)

XBee PRO S3B也称为XBee-900HP无线模块,它是一款工作在频段900~928MHz之间,基于FHSS跳频技术的远距离无线数传电台核心模块。常用型号如下: 类别 型号 开发套件 XKB9-DMT-UHP XBee-PRO 900HP (S3B) DigiMesh模块,200Kbps,软天线 XBP9B-DMWT-002 XBee-PRO 900HP (S3B)...

low米的博客 4505

聚焦112Gb/s SerDes芯片的AN/LT端口自协商和链路学习,评估验证高速链路的信号质量并分析调优(400/800G高速以太网互联接口,AI加速卡网络RDMA性能测试,交换背板接口性能评估)

在112G SerDes高速通道下的400G/800G高速以太网端口下,如何保障通信速率,验证SerDes的数据完整性和链路余量,自动协商(AN)和链路训练(LT)功能显得尤其重要,其在DAC、ACC、AEC铜缆连接或高速背板通信上,自动协商(AN)和链路训练(LT)的工作与否将决定高速链路传输质量的优劣。本文将系统的讨论介绍自动协商(AN)和链路训练(LT)的测试流程,其可以独立使用,也可以与teledynelecroy SierraNet M1288配合使用。

专注有线以太网性能测试--丹麦信雅纳网络(Xena Networks) 9402

Java中文乱码的处理方法

为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语编程。汉语编程是怎么回事我也不大清楚,应该是前年吧,我一朋友给我介绍汉语编程,怎么不错不错?当时因为学习忙没去关注这个,等我闲了,那个朋友不弄这个,问他他也不说不大清楚,最后自己对这个学习也不了了之了。 今天我写这个不是讲解中

Lzsoon.com 623

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

XMLHttp读取GB2312编码的网页

曲同学昨天问我一XMLHttp读取显示中文的问题,今天找了下资料。折腾了一下午,才搞定,记下。问题是这样的:用XMLHttp读取别人的网页,由于国内很多人把网页的编码设为GB2312,或其他不与UTF-8兼容的编码方式,而XMLHttp的默认编码方式为UTF-8,导致读取的中文内容不能正常被显示。解决:写一转码函数,先对读出的内容进行转码,然后再进行显示或者其他处理。网上多数解决方案是VBScri

浪子天涯行世录 7256

自抗扰控制(ADRC)原理与MATLAB实现详解

自抗扰控制(ADRC)是一种先进的鲁棒控制策略,其核心在于通过扩张状态观测器(ESO)实时估计并补偿系统总扰动。相比传统PID控制,ADRC不依赖精确数学模型,特别适合处理非线性、时变系统。从控制原理看,ADRC将系统内部动态和外部扰动统一建模,通过带宽参数化方法实现快速响应与强抗扰能力。在工程实践中,ADRC已成功应用于无人机飞控、伺服系统等场景,MATLAB仿真显示其上升时间可比PID提升46%,抗扰动恢复时间缩短60%。典型实现包含ESO设计、扰动补偿和PD控制三部分,参数整定遵循ω₀=3~5倍系统带

weixin_33585822的博客 95

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 423

XMLHttpRequest 乱码问题 在firefox IE的不同解决方法

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

fangfang200805的专栏 840

ShardingJDBC支持批量插入数据

最近在进行分库分表,但是有张表,里面有一些批量的插入。 也就是: insert xxx values(...),(...),(...) 这样的语句。 开始我的依赖是: <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <v

谙忆-陈浩翔 9763

关于android的RN项目爬去html内容的中文乱码问题

首先大概说一下乱码原因: 由于nodejs中不认gbk、gb2312等老的编码,我们获取这些编码网站的时候,nodejs会自动按照utf-8解码,然后就是一堆乱码问题。 这个时候,内容已经遭到了破坏,即使我们有办法反编码,也不可能得到正确的中文了。 我的解决办法: 在网上查了一天多,经过九九八十一难之后,我的解决办法终于出来了 首先安...

我的博客 2290

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

XMLHttpRequest乱码问题在Firefox与IE下的不同解决方法

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

weixin_30469895的博客 207

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

关于XMLHTTP对象返回编码问题的各种方法整理

第一种,我原先的办法。在服务器端加上UTF-8编码说明:%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>% Response.Charset="UTF-8" %>% Response.CodePage=65001%>其中上述代码中的第三行,被我加了注释。这是由于,在2003所带的IIS6当中,不支持这条命令。所以麻烦就来了:在本地用XP调试程序,就

xpnew的技术blog 4080

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

XMLHttp读取网页后续篇

 上一篇剩下的问题,为了搞明白编码问题,进一步进行测试。测试服务器端的设定,对客户端读取的影响。以及参数上传相关的东西。上回说到responseBody是未解码的二进制数据,而responseText是解码后的字符串,而xmlhttp默认解码方式为utf-8字符集,对于没有指定返回数据编码的页面,就会出现中文解码为乱码的情况。指定返回编码的方法:PHP:header(Content-Type

浪子天涯行世录 2939

[转]XMLHttpRequest乱码问题在Firefox与IE下的不同解决方法

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

weixin_30279315的博客 92

看完这10点,带你AJAX入门,前端开发网页

在传统的Web中我们已经解决过中文乱码问题了。为啥我能说这种方式屏蔽任何浏览器和服务器的编码格式,都不会乱码呢??六、XMLHttpRequest解决缓存问题在传统的Web中我们也解决过缓存的问题,但是呢,现在我们使用XMLHttpRequest,那我们要怎么解决缓存的问题呢??。这样的话,我就不能更换验证码图片了(等等应用)。加入时间戳参数到url时,也分两种情况”) >= 0){} else{七、XMLHttpRequest跨域访问。我们要怎么解决呢??这时候就要这个时候,

2401_84093407的博客 604

xmlhttp乱码的解决方案

1,服务器端可以用ADOstream 来解决   function Test() {     var http = GetXmlHttp();     var url=document.getElementById('durl').value     http.open("GET", url, true);         http.onreadystatechange = funct

548

gb2312使用ajax,编码为GB2312网站让AJAX接收的数据显示支持中文

var xmlHttp;var BrowerType="ie";function createXML(){try{xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e){try{xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");}catch(e2) {xmlHttp =false;}}if ...

weixin_42165490的博客 470

乱码的处理!程序员永远无法避免的话题 - 5

  7、toad的字符集的设置与oracle的安装   oracle数据库服务器的安装一般是中文字符集,有时安装在不同的平台下,设置为ISO编码,toad是oracle开发的最好工具,不是我说的,可是中文环境下安装的toad,打开英文字符的oracle时,中文全是乱码。必须进行设置   环境变量---〉系统变量   加   NLS_lANG=SIMPLIFIED CHINESE_CHI...

justJavaC的专栏 194

Tampermonkey油猴高效加载本地资源的两种实践方案

本文详细解析了在Tampermonkey油猴脚本中高效加载本地资源的两种核心方案。通过对比GM_getResourceText预加载与GM_xmlhttpRequest动态请求,深入剖析了其工作原理、适用场景、性能差异及常见坑点,帮助开发者根据静态配置或实时监控等不同需求,选择最佳实践方案,实现脚本与本地资源的灵活交互。

brandy的博客 477

java读取记事本,Java使用Ajax读取txt记事本的内容

这个也不算多么高的技术!首先要有index.jsp页面和 data.txt文本文件。-----------------------------------------------------------------index.jsp 5dwang.comvar xmlHttp;function createXMLHttpRequest(){if(window.ActiveXObject){xmlH...

weixin_36242784的博客 228

web客户端与服务器实时通信的方法

1 刷新,但是开销太大2 客户端使用java applet采用java applet技术与第一种方法类似,它只是将大多数编程操作封装在java小程序中,客户端在取到包含小程序引用的网页时,先去指定的服务器下载小程序到本地,然后执行它,由小程序建立与服务器的连接,并进行信息的收转工作3 使用控件,如microsoft的winsock控件http://www.xici.net/

木马屠城 6725
上一篇: SQL语句导入导出大全
下一篇: yield关键字与数据源
SmartJavaer
博客等级 码龄21年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值