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

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

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

时间: 2024-10-20 05:19:47

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

Linux中文显示乱码问题解决方法(编码查看及转换)

Linux中文显示乱码问题解决方法(编码查看及转换) 1,示例 图中名为一个.sql文件的一段内容,是一个数据库文件.其在windows中打开显示正常,在Linux中,中文部分显示为乱码. 注意:这个与数据库乱码的情况不同,属于文件内容的乱码. 2,分析 Linux系统与windows系统在编码上有显著的差别.Windows中的文件的格式默认是GBK(gb2312),而Linux系统中文件的格式默认是UTF-8.这两个系统就好比是中国和日本.文件就好比是一个人,如果要在另外的国家居住就要办理居住

数据库中文显示乱码问题解决办法

Ubuntu 14.04    mysql 5.5  python 2.7 从网页爬取数据存入数据库显示乱码 以root权限登录 修改mysql配置文件 /etc/init.d/my.cnf 找到[client]在下面加入 default-character-set=utf8 找到 [mysqld_safe]在下面加入 default-character-set=utf8 找到[mysqld]在下面加入 default-character-set=utf8 init_connect='SET N

DOS命令行窗口mysql中文显示乱码问题解决方法

MySQL的默认编码是Latin1,不支持中文,如何修改MySQL的默认编码呢,下面以 gbk为例来说明(这里只介绍Windows环境下) 1.中止MySQL服务(打开控制面板-->管理工具-->服务)找到MySQL,右键选择停止. 或者在cmd中敲入net stop mysql ,(mysql是服务名) 2.打开MySQL安装目录,找到my.ini文件. 3.打开my.ini文件 修改两个地方 或者,新建一个文件,my.ini [client]default-character-set=ut

ajax获取数据中文显示问号

技术交流群:816227112 问题: 解决 : 在 response.getWriter() 之前加上 response.setContentType("text/html;charset=UTF-8"); 参考: https://blog.csdn.net/qq_17885583/article/details/80519148 原文地址:https://www.cnblogs.com/helloworld6379/p/10699978.html

java jdbc 链接mysql插入数据中文显示乱码

1.读取数据正常,插入中文乱码查看链接处制定的字符集,这里使用utf-8 String url = "jdbc:mysql://127.0.0.1:3306/website?useUnicode=true&characterEncoding=utf-8 "; 完整代码如下: public mysqlConnect() { String driver = "com.mysql.jdbc.Driver"; // URL指向要访问的数据库名website Stri

load data infile 导入数据 中文显示乱码 解决方法

各种字符参数统一为utf8 SET character_set_client = utf8 ; SET character_set_connection = utf8 ; SET character_set_database = utf8 ; SET character_set_results = utf8 ; SET character_set_server = utf8 ; SET collation_connection = utf8 ; SET collation_database =

git status 下中文显示乱码问题解决

$ git status -s ?? "\350\257\264\346\230\216.txt\n $ printf "\350\257\264\346\230\216.txt\n" 说明.txt 通过将Git配置变量 core.quotepath 设置为false,就可以解决中文文件名称在这些Git命令输出中的显示问题, 示例: $ git config --global core.quotepath false $ git status -s ?? 说明.txt

jupyter画图中文显示乱码问题解决办法

下定决心好好修炼一下可视化能力,却发现自己电脑上jupyter notebook画图显示中文字符会显示为小方格,网上查找了好多方法,虽然每位分享者都写着亲测有效,但是叶子姐姐亲测无效,伤心.... 大海捞针式检索各大神方法,终于一不小心成功了,记录一下,以备下一台电脑又出现此问题!!! 1.anaconda加载中文字体库 将C:\Windows\Fonts\SimHei.ttf复制到anaconda安装路径\Lib\site-packages\matplotlib\mpl-data\fonts\

jmeter察看结果树—响应数据中的中文显示乱码的问题

jmeter察看结果树-响应数据中的中文显示乱码的问题: 打开文件:jmeter\bin\jmeter.properties 原始内容: 默认编码为:ISO-8859-1 # The encoding to be used if none is provided (default ISO-8859-1) #sampleresult.default.encoding=ISO-8859-1 修改为: sampleresult.default.encoding=utf-8 修改配置后,要重启jmete