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

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

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

          評論

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

          其實只要服務(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ù)  更多評論   

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

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

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

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

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

          @一農(nóng)

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

          這種情況下也無法通過客戶端(瀏覽器)來做js編碼(應(yīng)為解碼),因為有跨域限制,雖然網(wǎng)頁可以用腳本設(shè)置document.domain,可是xmlhttp無法設(shè)置。如果用服務(wù)器程序建立http連接來獲取這些第三方數(shù)據(jù)的話,也應(yīng)該用后臺服務(wù)器支持的解碼方法而不是自己編碼。

            回復(fù)  更多評論   

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

          @BlueDavy

          強!  回復(fù)  更多評論   

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

          to:一農(nóng)

          能具體給我說一說怎么弄嘛,我遇到這個問題沒解決出來,很是惱火哦!  回復(fù)  更多評論   

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

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

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

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

          # re: 備忘:解決ajax獲取頁面直接顯示亂碼的方法[未登錄] 2007-05-20 20:25 無為

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

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

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

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

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

          統(tǒng)計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 兰考县| 固安县| 神农架林区| 彭阳县| 德化县| 铜梁县| 永清县| 三门县| 寻乌县| 南平市| 大宁县| 临漳县| 商洛市| 祥云县| 海伦市| 敖汉旗| 尉氏县| 瑞丽市| 临朐县| 泾阳县| 西城区| 三亚市| 家居| 益阳市| 康定县| 长阳| 上虞市| 湖口县| 桃江县| 江北区| 吴川市| 江安县| 黑水县| 垫江县| 沙洋县| 陈巴尔虎旗| 泰来县| 澎湖县| 桐梓县| 德兴市| 辽阳县|