编码为GB2312网站让AJAX接收的数据显示支持中文

2014-10-23  来源:本站原创  分类:AJAX相关  人气:7 

GB2312 网站AJAX接收的数据显示支持中文

<script>
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 (!xmlHttp && typeof XMLHttpRequest != 'undefined'){
xmlHttp = new XMLHttpRequest();
BrowerType = "ff"; //用于记录是否火狐,以便下面处理接收中文数据分析使用。
}
}
function querytelcode(citys){
createXML();
showState=document.getElementById("showtelcode");
xmlHttp.onreadystatechange = function(){
if (xmlHttp.readyState == 2){
showState.innerHTML = '<img src="/img/process.gif" />';
}else if (xmlHttp.readyState == 4 && xmlHttp.status == 200){
if (BrowerType=="ff"){
getLastCode=xmlHttp.responseText;//FireFox
}else{
getLastCode=gb2utf8(xmlHttp.responseBody);
}
showState.innerHTML = getLastCode;
}
}
var url='myorderAjax.asp?oid=<%=Request.QueryString("orderid")%>&cityname='+citys;
xmlHttp.open ("GET",url,true);
if (BrowerType=="ff"){
xmlHttp.overrideMimeType("text/html;charset=gb2312");//设定以gb2312编码识别数据,只有FF支持。IE不行
}
xmlHttp.send(null);
}
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>

以下是此篇文章全文:
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编码,或者在服务端设置正确的编码信息。至于以上范例,有盗取其他网站内容的嫌疑,更是不为提倡。
附一篇:讨论:
原因:AJAX在接收responseText或responseXML的值的时候是按照UTF-8的格式来解码的,如果服务器段发送的数据不是UTF-8的格式,那么接收responseText或responseXML的值有可能为乱码。
解决办法: 在服务器指定发送数据的格式:
在jsp文件中:
response.setContentType("text/text;charset=UTF-8");//返回的是txt文本文件
或是
response.setContentType("text/xml;charset=UTF-8");//返回的xml文件
PHP:header('Content-Type:text/html;charset=GB2312');
ASP:Response.Charset("GB2312")
JSP:response.setHeader("Charset","GB2312");
讨论:
PHP:header('Content-Type:text/html;charset=GB2312');
这样写除非是小项目
大项目都是按照框架走
对于HEADER定义于config文件最前端解决方案
在JS里有一个解析utf-8xml的方法写的非常强
建议用那
非物理生命 traindiy

相关文章
  • 编码为GB2312网站让AJAX接收的数据显示支持中文 2014-10-23

    GB2312 网站AJAX接收的数据显示支持中文 <script> var xmlHttp; var BrowerType="ie"; function createXML(){ try{ xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e){ try{ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e2

  • 关于Apache默认编码错误 导致网站乱码的解决方案 2014-11-07

    Apache默认编码UTF-8在解析A网站的时候没有任何问题,当运行B网站时出现的"蝌蚪文"乱码问题 最近经常有同学在使用LAMP/WAMP时,遇到这样的编码错误问题: A网站程序编码UTF-8编码安装成功,运行成功. B网站程序编gb2312也要安装在同一服务器上. 这样就出现问题了,Apache默认编码UTF-8在解析A网站的时候没有任何问题,当运行B网站时出现的"蝌蚪文"乱码问题. 单纯的修改Apache默认编码为gb2312这样就导致A网站出现"蝌

  • 做网站用UTF-8编码还是GB2312编码? 2013-04-03

    经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符, WordPress程序是用的UTF-8,很多cms用的是GB2312. ● 为什么有这么多编码? ● UTF-8和GB2312有什么区别? ● 我们在国内做网站是用UTF-8编码格式还是GB2312编码格式好? 一. 各种编码的来历 可能很多同学一直对字符的各种编码方式懵懵懂懂,根本搞不清为什么他们有这么多编码. ANSI编码 其实在很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合

  • ajax接收Date类型的数据时会把数据转换为时间戳 2014-03-06

    ajax接收Date类型的数据时将会把数据转换为时间戳,下面是具体的示例,大家可以参考下 $("#test").click(function(e) { $.get( "/mgr/datacleaning/test", function(data) { console.log(data + " from $.get()"); } ); var xhr = new XMLHttpRequest(); xhr.open("GET",

  • ThinkPHP中使用ajax接收json数据的方法 2014-05-02

    这篇文章主要介绍了ThinkPHP中使用ajax接收json数据的方法,包括了前台js代码与对应的PHP处理代码,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了ThinkPHP中使用ajax接收json数据的方法.分享给大家供大家参考.具体分析如下: 这里通过ThinkPHP+jquery实现ajax,扩展了下,写了个查询,前台代码如下: 首先需要引入jquery.js,主要代码如下: function ajax(id,pic){ //由于ThinkPHP不解析JavaScript里的T

  • Facebook网站的Ajax化.缓存和流水线 2011-05-28

    演讲幻灯片: Facebook网站的Ajax化.缓存和流水线 [PDF] 在这个报告中,我将介绍在Facebook网站前端性能优化中采用的最主要的一些技术.这些技术不光降低了服务器的开销,而且同时极大地提高了Facebook网站的用户体验性能. 我将首先介绍Quickling技术.通过Quickling,Facebook将所有的用户点击访问自动地转变成AJAX调用,避免了大量的服务器端重复计算和客户端的重复渲染. 然后我将介绍基于Quickling的PageCache技术,通过JavaScrip

  • JQuery的Ajax中Post方法传递中文出现乱码的解决方法 2015-03-21

    这篇文章主要介绍了JQuery的Ajax中Post方法传递中文出现乱码的解决方法,较为深入的分析了Ajax的post方法出现乱码的原因,以及具体的解决方法,需要的朋友可以参考下 本文实例讲述了JQuery中Post传递中文出现的解决方法,即乱码ajax与jquery.ajax中文参数post传递乱码处理方法.分享给大家供大家参考.具体分析如下: 问题一: 今天在做项目时,需要用到Ajax,之前我在用GET方式传递中文参数时,只需要在后台程序中设置页面编码为GB2312即中文能正常显示,可是这次由

  • jquery.ajax的url中传递中文乱码问题的解决方法 2014-12-28

    本篇文章主要是对jquery.ajax的url中传递中文乱码问题的解决方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQuery正在乱码的原因,在未指定字符集的时候,是使用ISO-8859-1 ISO8859-1,通常叫做Latin-1.Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符. JQuery的Ajax根本没有考虑到国际化的问题,使用

  • jsp中 ajax的get请求的中文乱码问题的解决方法 2014-10-18

    这篇文章介绍了jsp中ajax的get请求的中文乱码问题的解决方法,有需要的朋友可以参考一下 一般Tocant 的url编码是iso-8859-1(查看tocat/conf/server.xml 中的Connector 节点没有写URIEncoding="xxxxxx") 如下: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" re

  • firefox下对ajax的onreadystatechange的支持情况分析 2013-11-02

    firefox下对ajax的onreadystatechange的支持分析.用的到的朋友可以参考下. 一.问题: var xmlHttp; function savecarttodata(){ createXMLHttpRequest(); var rndcode = new Date().getTime(); var CartUrl ="a.asp?cache="+rndcode xmlHttp.onreadystatechange = function(){ ..... } xml

  • 一个AJAX自动完成功能的js封装源码[支持中文]第1/2页 2014-01-31

    Screenshots Pagination Internationalization Rich format Text selection 源码下载 有个问题,等高手解决,就是怎么搞都不能支持中文,不知道要改哪个地方!期待 ASP+AJAX autocompant ASP完整演示 ASP+AJAX源码下载 翻页和其他扩展功能正在完善 比如 new CAPXOUS.AutoComplete("wiki", function() { return "autocomplete3.

  • 查看修改mysql编码方式让它支持中文(gbk或者utf8) 2014-04-08

    MySQL的默认编码是Latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8,真的是很麻烦啊,不过本文提供了详细的修改教程,感兴趣的你可不要走开啊,希望本文对你有所帮助 MySQL的默认编码是Latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8. 1.需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:>mysql -u root ?p,之后两次输入root用户的密码),查看数据库的编码方式命令为: >s

  • 好图网:支持中文的ICO图标搜索引擎网站 2014-01-29

    之前有推荐过大家几个图标搜索引擎,比如Mr.Icons,但是不支持中文.现在推荐一个来自读者中的一位朋友推荐的支持中文图标搜索的网站:好图网.Anliu觉得不错就推荐给大家,而且还支持中文搜索的,据称目前共有652890个图标,2640个图标集. 好图网支持中文搜索,比如够趣堂的icon是一个地球,输入中文地球就可以搜索到相关的icon图标,可以根据需要的尺寸进行筛选. 该搜索引擎还提供2640个图集,你可以查看下热门图集,另外下载的话还提供多种格式的.

  • 支持中文搜索的5个Twitter应用网站 2015-02-19

    写博客之前,我不知道有 Google,只是用百度:玩 Twitter 之前,我不知道什么叫"即时搜索",只是用 Google 和百度:撞车之后,除了搜索百度和 Google,我还会搜索一下 Twitter -- 其他微博客则很少用. 为什么呢?因为 Twitter 上的信息是一发布就可以被搜索到的,而百度和 Google 这些搜索引擎收录一个网页的时间是比较长的.例如,这篇文章发表之后,其标题和链接肯定是先出现于 Twitter,几个小时之后才能在 Google 和百度上找到. 另外,

  • js 编码转换 gb2312 和 utf8 互转的2种方法 2015-03-04

    这篇文章介绍了gb2312 和 utf8 互转的JS方法,有需要的朋友可以参考一下 方法一: function gb2utf8(data){ var glbEncode = []; gb2utf8_data = data; execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript"); var t=escape(gb2utf8_data).replace(/%u/g,"").repl

  • 深入图解字符集与字符集编码(九)--GB2312,GBK,GB18030 2014-12-05

    前面的一些篇章更多谈论了Unicode的相关话题,虽然也有提到GBK等编码,但都没细说,这里打算系统说一下.GB系列包括GB2312,GBK,GB18030. 前面已经提过,GB=Guo Biao=国标=国家标准,至于所谓的2312就是一编号了,没有其它特别的意义,18030类似.GBK没有编号,所以它实际上并不是国家标准,只是一个事实标准,GBK中K指"扩展"的意思. 最早的是GB2312,我们从它开始说起. GB2312 以下为一简介(官方文档见:http://gbread.sac

  • HTML5Gallery:一个专门收集用HTML5编码制作的网站导航 2014-04-27

    HTML5Gallery: 是一个专门收集用HTML5代码制作的网页的网站导航,Gallery网站越来越细分化,如果你正准备学习HTML5,可以从这些网站里面查看各种实例,提高你对HTML的认知和使用.这里我们可以学习到国外优秀的网页制作方法,有兴趣的童鞋可以去看看能不能学到对自己有价值的知识. 访问地址是:http://html5gallery.com/

  • PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc 2015-04-20

    PHP是全世界上使用率最高的网页开发语言,台湾每4个网站,就有1个用PHP语言开发.1995年发明PHP语言的Rasmus Lerdorf,也是打造出Yahoo全球服务网站的架构师之一,他首度来台分享如何架构网站扩充性丶安全性和效能的秘诀. Q:越来越多Web 2.0网站走向应用平台,你认为打造这类平台的关键为何? A:简单来看,应用平台就是API,任何Ajax或 Web 2.0类型的网站,都是在应用平台上运用了API来创造出视觉介面的互动效果.例如Yahoo Mail,透过简单的Request

  • Linux下设置Eclipse编码为GBK进而支持中文 2012-03-20

    1.修改/var/lib/locales/supported.d/local sudo vim /var/lib/locales/supported.d/local 在文件的最后加入如下内容 zh_CN.GBK GBK zh_CN.GB2312 GB2312 2.重新进行设置 sudo dpkg-reconfigure --force locales 3.更改eclipse编码设置 选择eclipse的菜单栏windows,然后进入preferences.然后选择general下的workspa

  • AspNetAjaxPager,Asp.Net通用无刷新Ajax分页控件,支持多样式多数据绑定 2014-06-30

    最近闲来没事,总结了一些asp.net分页经验,为使用方便现在写了一个可以通用的分页控件:AspNetAjaxPager:,使用ajax技术实现无刷新分页,能够控制所有数据绑定控件的分页,自己觉得效果还是挺不错的,现在奉献给大家! 本控件可以对GridView,Repeater,DataGrid,DataList...几乎所有的.net数据绑定控件进行分页,全部无刷新,数据绑定部分可以使用存储过程也可以直接使用sql语句,这对本控件没有任何干扰!本控件具有较好的用户界面,能够根据需要变换各种样式