備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法

          大家都知道,xmlhttp在通信時(shí)采用的是utf編碼,而國(guó)內(nèi)很多網(wǎng)頁(yè)的信息都是采用gbk編碼,所以當(dāng)直接通過(guò)ajax去連接網(wǎng)頁(yè),并將獲取到的信息直接顯示的話就會(huì)出現(xiàn)亂碼的現(xiàn)象,有些時(shí)候無(wú)法改變服務(wù)器端網(wǎng)頁(yè)的編碼(例如獲取別的網(wǎng)站的天氣預(yù)報(bào)信息),在這種時(shí)候就只能在客戶端通過(guò)js做編碼的工作了,下面這段js就是用于將服務(wù)器端返回的gbk編碼字符串轉(zhuǎn)換為utf編碼字符串:
          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("%"));??
          }
          這段代碼也是從網(wǎng)上搜到的,具體是誰(shuí)寫(xiě)的不清楚,所以在此未標(biāo)明作者,如作者看到還請(qǐng)見(jiàn)諒。
          有了這段代碼后,就可以直接對(duì)返回的網(wǎng)頁(yè)內(nèi)容進(jìn)行編碼了:
          var response=gb2utf8(response.responseBody);
          經(jīng)過(guò)這樣的轉(zhuǎn)碼后所獲得的頁(yè)面內(nèi)容就不會(huì)有亂碼現(xiàn)象了;
          當(dāng)然,如果服務(wù)器端頁(yè)面采用的是utf-8的編碼那就根本不需要進(jìn)行編碼工作了。

          posted on 2006-08-15 11:04 BlueDavy 閱讀(5418) 評(píng)論(10)  編輯  收藏 所屬分類: Java

          評(píng)論

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法 2006-08-15 13:43 emu

          其實(shí)只要服務(wù)器返回的數(shù)據(jù)頭聲明了
          <?xml version="1.0" encoding="gb2312"?>
          xmlhttp(request)控件應(yīng)該就可以正確解碼了。

          編碼可以參考一下:
          http://www.aygfsteel.com/emu/articles/31283.html
          http://www.aygfsteel.com/emu/articles/31756.html   回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法 2006-08-16 12:22 一農(nóng)

          @emu
          1、樓主已經(jīng)說(shuō)了
          “有些時(shí)候無(wú)法改變服務(wù)器端網(wǎng)頁(yè)的編碼(例如獲取別的網(wǎng)站的天氣預(yù)報(bào)信息),在這種時(shí)候就只能在客戶端通過(guò)js做編碼的工作了,”
          2、這個(gè)方法在firefox應(yīng)該不行,所以ajax的編碼問(wèn)題在瀏覽器里還是不能完全解決,只有等瀏覽器擴(kuò)展,并且統(tǒng)一處理方法了。
          execScript("gb2utf8_data = MidB(gb2utf8_data, 1)", "VBScript");   回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法 2006-08-16 19:52 BlueDavy

          @一農(nóng)
          在firefox下非常簡(jiǎn)單,可以調(diào)用xmlhttprequest來(lái)強(qiáng)制使用GBK編碼,這樣xmlhttprequest在發(fā)起請(qǐng)求和接收響應(yīng)時(shí)就不再采用UTF-8了:
          xmlHttpRequest.overrideMimeType("text/html;charset= gbk");  回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法 2006-08-16 20:46 emu

          @一農(nóng)

          1 “有些時(shí)候無(wú)法改變服務(wù)器端網(wǎng)頁(yè)的編碼(例如獲取別的網(wǎng)站的天氣預(yù)報(bào)信息),在這種時(shí)候就只能在客戶端通過(guò)js做編碼的工作了,”

          這種情況下也無(wú)法通過(guò)客戶端(瀏覽器)來(lái)做js編碼(應(yīng)為解碼),因?yàn)橛锌缬蛳拗疲m然網(wǎng)頁(yè)可以用腳本設(shè)置document.domain,可是xmlhttp無(wú)法設(shè)置。如果用服務(wù)器程序建立http連接來(lái)獲取這些第三方數(shù)據(jù)的話,也應(yīng)該用后臺(tái)服務(wù)器支持的解碼方法而不是自己編碼。

            回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法 2006-08-16 20:48 emu

          @BlueDavy

          強(qiáng)!  回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法 2006-08-18 15:47 @asan

          to:一農(nóng)

          能具體給我說(shuō)一說(shuō)怎么弄嘛,我遇到這個(gè)問(wèn)題沒(méi)解決出來(lái),很是惱火哦!  回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法 2006-08-26 09:11 java人

          請(qǐng)問(wèn)你這段代碼是在服務(wù)端跑還是在客戶端跑?  回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法 2006-08-26 10:13 BlueDavy

          ...客戶端js  回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法[未登錄](méi) 2007-05-20 20:25 無(wú)為

          厲害,非常實(shí)用  回復(fù)  更多評(píng)論   

          # re: 備忘:解決ajax獲取頁(yè)面直接顯示亂碼的方法[未登錄](méi) 2007-06-08 21:21 哈哈

          我是用js文件調(diào)用頁(yè)面..我的頁(yè)面在單獨(dú)的情況下可以顯示沒(méi)有亂碼...但是在用js調(diào)用時(shí)就出現(xiàn)亂碼....是什么問(wèn)題.....那位大俠幫幫我啊....  回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 陇南市| 英超| 东莞市| 岳普湖县| 泰州市| 阿坝县| 卫辉市| 元氏县| 修文县| 奎屯市| 牡丹江市| 金乡县| 甘孜县| 水城县| 井研县| 涪陵区| 巧家县| 遵义县| 沅陵县| 望奎县| 民勤县| 巫溪县| 山东省| 额敏县| 随州市| 陈巴尔虎旗| 德庆县| 孝昌县| 呼和浩特市| 普洱| 武义县| 台北县| 西峡县| 苗栗县| 杭锦后旗| 丰都县| 类乌齐县| 罗城| 黔东| 黄骅市| 隆尧县|