Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 979|回复: 0

GBK编码网站使用AJAX接收数据中文显示乱码问题解决

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-4 15:09:36 | 显示全部楼层 |阅读模式

    XMLHttpRequest 默认是用UTF-8 传递数据。当服务端和客户端以及数据库统一使用UTF-8编码可以有效的避免乱码问题。如果服务端设置了正确的Content-Type Response Header以及编码信息,那么XmlHttpRequest也可以正确工作。
    可是当使用XMLHttpRequest读取中文网页内容时, 如果服务端的程序没有设置Content-Type Response Header,或者Header没有设置编码类型,那么我们访问responseText属性的时候就可能遭遇乱码。如以下代码用XMLHttpRequest获取代码学堂首页:

    1. xmlhttp = getXMLHttpRequest(); 
    2. var url = "http://www.uxuew.cn/"; 
    3. xmlhttp.open("GET", url, true); 
    4. xmlhttp.onreadystatechange = function(){ 
    5. if (xmlhttp.readyState == 4) 
    6. if (xmlhttp.status == 200) 
    7. alert(xmlhttp.responseText); 
    8. }; 
    9. xmlhttp.send(null); 

    纵使代码学堂这种专业的教程网站,对web标准的支持还很不彻底,弹出的html源码中充斥不符合web标准的html标签,当然还有已预见的乱码。
    同样遗憾的是,FireFox 和 IE 的解决方法也是南辕北辙
    FireFox 做法:
    FireFox 的XMLHttpRequest对象支持overrideMimeType方法,可以指定返回数据的编码类型,利用该方法可以解决中文乱码,前面的代码修改如下:

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

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

    1. function gb2utf8(data){ 
    2. var glbEncode = []; 
    3. gb2utf8_data = data; 
    4. execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript"); 
    5. var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/g,"@$1$2"); 
    6. t=t.split("@"); 
    7. var i=0,j=t.length,k; 
    8. while(++i<j) { 
    9. k=t.substring(0,4); 
    10. if(!glbEncode[k]) { 
    11. gb2utf8_char = eval("0x"+k); 
    12. execScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript"); 
    13. glbEncode[k]=escape(gb2utf8_char).substring(1,6); 
    14. t=glbEncode[k]+t.substring(4); 
    15. gb2utf8_data = gb2utf8_char = null; 
    16. return unescape(t.join("%")); 
    17. xmlhttp = getXMLHttpRequest(); 
    18. var url = "http://www.uxuew.cn/";; 
    19. xmlhttp.open("GET", url, true); 
    20. xmlhttp.onreadystatechange = function(){ 
    21. if (xmlhttp.readyState == 4) 
    22. if (xmlhttp.status == 200) 
    23. alert(gb2utf8(xmlhttp.responseBody)); //注意这里要用responseBody 
    24. }; 
    25. xmlhttp.send(null); 

    gb2utf8函数直接解析XMLHttpRequest返回的二进制数据,其中要利用execScript方法来执行VBScript的函数。所以说是一个杂交的函数。感谢blueidea论坛 提供的算法。
    虽然有了解决的办法,但形式丑陋,而且不符合web标准。所以应该在编程中尽量避免,如果是开发web应用,应尽量使用UTF-8编码,或者在服务端设置正确的编码信息


    原因:AJAX在接收responseText或responseXML的值的时候是按照UTF-8的格式来解码的,如果服务器段发送的数据不是UTF-8的格式,那么接收responseText或responseXML的值有可能为乱码。
    解决办法: 在服务器指定发送数据的格式:

    1. 在jsp文件中: 
    2. response.setContentType("text/text;charset=UTF-8");//返回的是txt文本文件 
    3. 或是 
    4. response.setContentType("text/xml;charset=UTF-8");//返回的xml文件 
    5. PHP:header('Content-Type:text/html;charset=GB2312'); 
    6. ASP:Response.Charset("GB2312") 
    7. JSP:response.setHeader("Charset","GB2312"); 

    完整代码如下:

    1. <script> 
    2. var xmlHttp; 
    3. var BrowerType="ie"; 
    4. function createXML(){ 
    5. try{ 
    6. xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 
    7. catch (e){ 
    8. try{ 
    9. xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    10. }catch(e2) { 
    11. xmlHttp =false; 
    12. if (!xmlHttp && typeof XMLHttpRequest != 'undefined'){ 
    13. xmlHttp = new XMLHttpRequest(); 
    14. BrowerType = "ff"; //用于记录是否火狐,以便下面处理接收中文数据分析使用。
    15. function querytelcode(citys){ 
    16. createXML(); 
    17. showState=document.getElementById("showtelcode"); 
    18. xmlHttp.onreadystatechange = function(){ 
    19. if (xmlHttp.readyState == 2){ 
    20. showState.innerHTML = '<img src="/img/process.gif" />'; 
    21. }else if (xmlHttp.readyState == 4 && xmlHttp.status == 200){ 
    22. if (BrowerType=="ff"){ 
    23. getLastCode=xmlHttp.responseText;//FireFox
    24. }else{ 
    25. getLastCode=gb2utf8(xmlHttp.responseBody); 
    26. showState.innerHTML = getLastCode; 
    27. var url='http://www.uxuew.cn?oid=<%=Request.QueryString("orderid")%>&cityname='+citys; 
    28. xmlHttp.open ("GET",url,true); 
    29. if (BrowerType=="ff"){ 
    30. xmlHttp.overrideMimeType("text/html;charset=gb2312");//设定以gb2312编码识别数据,只有FF支持。IE不行
    31. xmlHttp.send(null); 
    32. function gb2utf8(data){ 
    33. var glbEncode = []; 
    34. gb2utf8_data = data; 
    35. execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript"); 
    36. var t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/g,"@$1$2"); 
    37. t=t.split("@"); 
    38. var i=0,j=t.length,k; 
    39. while(++i<j) { 
    40. k=t.substring(0,4); 
    41. if(!glbEncode[k]) { 
    42. gb2utf8_char = eval("0x"+k); 
    43. execScript("gb2utf8_char = Chr(gb2utf8_char)", "VBScript"); 
    44. glbEncode[k]=escape(gb2utf8_char).substring(1,6); 
    45. t=glbEncode[k]+t.substring(4); 
    46. gb2utf8_data = gb2utf8_char = null; 
    47. return unescape(t.join("%")); 
    48. </script> 
    49.  
     

    转载请注明:代码学堂>web前端 > ajax技巧 > http://www.uxuew.cn/ajax/6006.html

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 04:24 , Processed in 0.196612 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表