解決遠(yuǎn)程頁(yè)面抓取中的亂碼問題?
更新時(shí)間:2007年03月04日 00:00:00 作者:
由于平時(shí)使用的網(wǎng)頁(yè)文件基本上都是gb2312編碼方式,如果通過xmlhttp控件讀取的話,肯定會(huì)出現(xiàn)亂碼問題,但是要把所有文件都改成utf-8編碼,操作上比較麻煩。經(jīng)過反復(fù)比較,我找到了相對(duì)實(shí)用的解決方法。
ff提供了overrideMimeType方法,可以指定返回值的編碼,所以解決起來(lái)比較簡(jiǎn)單,只要把這個(gè)方法指向gb2312就可以了。對(duì)于IE,可以用vbs配合來(lái)作編碼轉(zhuǎn)換,用gb2utf8來(lái)轉(zhuǎn)換接收到的二進(jìn)制數(shù)據(jù),其中利用到execScript方法來(lái)調(diào)用vbs的函數(shù)。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
ie下的轉(zhuǎn)碼可以改進(jìn),通過正則的回調(diào)過程能提高不少效率
this.bs2str = function(bs){
if(!window.jsMidB) main.vbInit("MidB", 2);
if(!window.jsChr) main.vbInit("Chr", 1);
if(!bs2str.ss) bs2str.ss = [];
return unescape(escape(jsMidB(bs,1)).replace(/(.{2})(.{2})(.{2})/g, "%$3%$2").replace(/%([^0-7].)(.)(.{2})/g, function(a,a1,a2,a3){var s=a1+a3;if(!bs2str.ss[s]) bs2str.ss[s]=jsChr(eval("0x"+s));return bs2str.ss[s];}));
}
不過我還是認(rèn)為載入數(shù)據(jù)用xmldom要好一些
replace(/(.{2})(.{2})(.{2})/g, "%$3%$2") 改成 replace(/.{2}(.{2})(.{2})/g, "%$2%$1") 少一個(gè)存儲(chǔ).比原來(lái)的快3倍以上.
把eval去掉,效率還能提高一些
// byte() encoding
this.bs2str = function(bs){
if(!window.jsMidB) main.vbInit("MidB", 2);
if(!window.jsChr) main.vbInit("Chr", 1);
if(!this.bs2str.ss) this.bs2str.ss = [];
return unescape(escape(jsMidB(bs,1)).replace(/.{2}(.{2})(.{2})/g, "%$2%$1").replace(/%([^0-7].)(.)(.{2})/g, function(a,a1,a2,a3){var s=a1+a3;if(!This.bs2str.ss[s]) This.bs2str.ss[s]=jsChr("&H"+s);return This.bs2str.ss[s];}));
}
ff提供了overrideMimeType方法,可以指定返回值的編碼,所以解決起來(lái)比較簡(jiǎn)單,只要把這個(gè)方法指向gb2312就可以了。對(duì)于IE,可以用vbs配合來(lái)作編碼轉(zhuǎn)換,用gb2utf8來(lái)轉(zhuǎn)換接收到的二進(jìn)制數(shù)據(jù),其中利用到execScript方法來(lái)調(diào)用vbs的函數(shù)。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
ie下的轉(zhuǎn)碼可以改進(jìn),通過正則的回調(diào)過程能提高不少效率
復(fù)制代碼 代碼如下:
this.bs2str = function(bs){
if(!window.jsMidB) main.vbInit("MidB", 2);
if(!window.jsChr) main.vbInit("Chr", 1);
if(!bs2str.ss) bs2str.ss = [];
return unescape(escape(jsMidB(bs,1)).replace(/(.{2})(.{2})(.{2})/g, "%$3%$2").replace(/%([^0-7].)(.)(.{2})/g, function(a,a1,a2,a3){var s=a1+a3;if(!bs2str.ss[s]) bs2str.ss[s]=jsChr(eval("0x"+s));return bs2str.ss[s];}));
}
不過我還是認(rèn)為載入數(shù)據(jù)用xmldom要好一些
replace(/(.{2})(.{2})(.{2})/g, "%$3%$2") 改成 replace(/.{2}(.{2})(.{2})/g, "%$2%$1") 少一個(gè)存儲(chǔ).比原來(lái)的快3倍以上.
把eval去掉,效率還能提高一些
復(fù)制代碼 代碼如下:
// byte() encoding
this.bs2str = function(bs){
if(!window.jsMidB) main.vbInit("MidB", 2);
if(!window.jsChr) main.vbInit("Chr", 1);
if(!this.bs2str.ss) this.bs2str.ss = [];
return unescape(escape(jsMidB(bs,1)).replace(/.{2}(.{2})(.{2})/g, "%$2%$1").replace(/%([^0-7].)(.)(.{2})/g, function(a,a1,a2,a3){var s=a1+a3;if(!This.bs2str.ss[s]) This.bs2str.ss[s]=jsChr("&H"+s);return This.bs2str.ss[s];}));
}
相關(guān)文章
JavaScript數(shù)據(jù)類型學(xué)習(xí)筆記
這篇文章主要針對(duì)JavaScript數(shù)據(jù)類型整理的學(xué)習(xí)筆記,分享給大家,感興趣的小伙伴們可以參考一下2016-01-01
js獲取鼠標(biāo)點(diǎn)擊的對(duì)象,點(diǎn)擊另一個(gè)按鈕刪除該對(duì)象的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇js獲取鼠標(biāo)點(diǎn)擊的對(duì)象,點(diǎn)擊另一個(gè)按鈕刪除該對(duì)象的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2016-05-05
JavaScript基于inquirer封裝一個(gè)控制臺(tái)文件選擇器
這篇文章主要介紹了JavaScript基于inquirer封裝一個(gè)控制臺(tái)文件選擇器,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08
獲取offsetTop和offsetLeft值的js代碼(兼容)
offsetTop和offsetLeft的值在某些特殊的情況下是會(huì)使用到的,為了實(shí)現(xiàn)值的準(zhǔn)確獲取,本文采用js代碼實(shí)現(xiàn)下,有需求的朋友可以參考下哈2013-04-04
JS基礎(chǔ)之undefined與null的區(qū)別分析
在JavaScript開發(fā)中,被人問到:null與undefined到底有啥區(qū)別?一時(shí)間不好回答,特別是undefined,因?yàn)檫@涉及到undefined的實(shí)現(xiàn)原理。2011-08-08
JS?中的類Public,Private?和?Protected詳解
這篇文章主要介紹了JS中的類Public,Private和Protected詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
JavaScript中的16進(jìn)制字符(改進(jìn))
后來(lái)經(jīng)過自己的測(cè)試,發(fā)現(xiàn)將字符轉(zhuǎn)換為十六進(jìn)制的方法不完善。2011-11-11

