编码为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

时间: 2024-09-19 23:58:49

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

编码为GB2312网站让AJAX接收的数据显示支持中文_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 =f

网站整体编码转换为gb2312,之前为utf8

问题描述 网站整体编码转换为gb2312,之前为utf8 基于thinkphp开发的网站,现在要把网站的整体编码格式改为gb2312,默认为utf8.急求大神指点 解决方案 http://www.51zxw.net/study.asp?vip=12576487 解决方案二: 那估计还是有点麻烦,,代码都得改

解决编码为gb2312页面ajax交互汉字乱码问题

解决编码为gb2312页面ajax交互汉字乱码问题 ajax只支持utf-8格式,不能支持gb2312编码格式,所以经常遇到gb2312的编码的程序使用ajax就出现乱码,刚找到一种解决方案是: 服务器端传送的数据仍是gb2312编码,客户端用js将汉字转变成utf8编码显示在页面 search.php教程 <?php header("content-type: text/html; charset=gb2312"); include './search.htm'; ?>

关于Apache默认编码错误 导致网站乱码的解决方案_Linux

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

jquery ajax 接收返回值 是个URL 字符串,为空,在线等

问题描述 jquery ajax 接收返回值 是个URL 字符串,为空,在线等 jquery ajax 接收返回值 是个URL 字符串,为空,后台debug看了,肯定传了. 前台接收类型'text'.没啥问题,是否有其他原因 解决方案 上代码呀.不然怎么排查原因 解决方案二: jQuery.ajax({ type:'post', url:"/financeReport/generateURL.do", cache:false, data:{"reportType":

json传值以及ajax接收详解_javascript技巧

一开始进入公司,做起项目来比较不知所措,现在一个月过去了,越来越得心应手,下面是json向前端传值以及前端ajax接收,给自己记下也分享给大家. 这是两个类型不同的json与ajax的数据交互(集合.类对象) JsonConfig jsonConfig = new JsonConfig(); //lenient jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); JSONArray json = JSONAr

ThinkPHP中使用ajax接收json数据的方法_php实例

本文实例讲述了ThinkPHP中使用ajax接收json数据的方法.分享给大家供大家参考.具体分析如下: 这里通过ThinkPHP+jquery实现ajax,扩展了下,写了个查询,前台代码如下: 首先需要引入jquery.js,主要代码如下: 复制代码 代码如下: function ajax(id,pic){     //由于ThinkPHP不解析JavaScript里的ThinkPHP常量,所以需要先在这里定义. var URL='__URL__';         $.ajax({     

httpwebresponse-[vb.net]HttpWebResponse的编码问题——GB2312乱码

问题描述 [vb.net]HttpWebResponse的编码问题--GB2312乱码 我想用这段代码登录获取cookie,然后再访问用户页面,这一部分工作正常.可是如果遇到GB2312编码的网页就会出现乱码.请高手指点,万分感谢! 另:选这个网址仅供说明只用,没有别的意思. Imports System.Net Imports System.IO Imports System.Text Public Class Form1 Const ConnectURL = "http://www.guqu

JQuery的Ajax中Post方法传递中文出现乱码的解决方法_jquery

本文实例讲述了JQuery中Post传递中文出现的解决方法,即乱码ajax与jquery.ajax中文参数post传递乱码处理方法.分享给大家供大家参考.具体分析如下: 问题一: 今天在做项目时,需要用到Ajax,之前我在用GET方式传递中文参数时,只需要在后台程序中设置页面编码为GB2312即中文能正常显示,可是这次由于表单项目较多,不适合用GET方式传递,只能用POST方式,但发现后台程序中设置编码为GB2312时中文还是显示的乱码.经过一番研究问题才最终得到解决. 解决方法: 解决此问题的