JScript中使用ADODB.Stream判斷文件編碼的代碼
更新時(shí)間:2008年06月09日 12:08:12 作者:
在實(shí)現(xiàn)TextStraem的時(shí)候,找到判斷文件編碼的代碼是VBS的,但是在JScript中是沒有ASC等函數(shù)的,也不能對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行處理,因此需要通過一個(gè)特別的方法來獲取文件開關(guān)的編碼標(biāo)識(shí)。
一開始使用ASCII編碼來讀取文本數(shù)據(jù),模擬讀取二進(jìn)制數(shù)據(jù),但是發(fā)現(xiàn)如果字符編碼大于127時(shí),只會(huì)得到小于128的值,相當(dāng)于和128取余了,因此ASCII編碼是不行的。
繼續(xù)尋找,在CodeProejct.com找到一篇文章《Reading And Writing Binary Files Using JScript》,里面剛好有我需要的內(nèi)容。
其實(shí)說來也簡(jiǎn)單,就是把編碼換一下,使用437,這個(gè)是IBM擴(kuò)展過的ASCII編碼,把ASCII編碼的最高位也利用起來,將字符集中的字符從128個(gè)擴(kuò)展到256個(gè),而使用這個(gè)字符集讀取的字符數(shù)據(jù)就相當(dāng)于原始二進(jìn)制數(shù)據(jù)了。
解決了障礙后,就要開始識(shí)別文件的編碼了,通過使用ADODB.Stream對(duì)象來讀取文件的開始兩個(gè)字節(jié),然后根據(jù)這兩個(gè)字節(jié)就可以判斷文件編碼是什么了。
UTF-8文件如果帶BOM的話,那么頭兩個(gè)字節(jié)就是0xEF、0xBB,再例如Unicode文件的開始兩個(gè)字節(jié)是0xFF、0xFE,這些就是判斷文件編碼的依據(jù)。
需要注意的是,在ADODB.Stream讀取字符時(shí),并不是一一對(duì)應(yīng)的,也就是說,如果二進(jìn)制數(shù)據(jù)是0xEF,讀取出來的字符經(jīng)過charCodeAt之后,并不是0xFE,而是另外的值,這個(gè)對(duì)應(yīng)表可以在上面提到的文章里查到。
程序代碼:
function CheckEncoding(filename) {
var stream = new ActiveXObject("ADODB.Stream");
stream.Mode = 3;
stream.Type = 2;
stream.Open();
stream.Charset = "437";
stream.LoadFromFile(filename);
var bom = escape(stream.ReadText(2));
switch(bom) {
// 0xEF,0xBB => UTF-8
case "%u2229%u2557":
encoding = "UTF-8";
break;
// 0xFF,0xFE => Unicode
case "%A0%u25A0":
// 0xFE,0xFF => Unicode big endian
case "%u25A0%A0":
encoding = "Unicode";
break;
// 判斷不出來就使用GBK,這樣可以在大多數(shù)情況下正確處理中文
default:
encoding = "GBK";
break;
}
stream.Close();
delete stream;
stream = null;
return encoding;
}
這樣,在需要的時(shí)候,通過調(diào)用CheckEncoding函數(shù)就可以獲取文件的編碼了。
希望此文對(duì)你有所幫助。
繼續(xù)尋找,在CodeProejct.com找到一篇文章《Reading And Writing Binary Files Using JScript》,里面剛好有我需要的內(nèi)容。
其實(shí)說來也簡(jiǎn)單,就是把編碼換一下,使用437,這個(gè)是IBM擴(kuò)展過的ASCII編碼,把ASCII編碼的最高位也利用起來,將字符集中的字符從128個(gè)擴(kuò)展到256個(gè),而使用這個(gè)字符集讀取的字符數(shù)據(jù)就相當(dāng)于原始二進(jìn)制數(shù)據(jù)了。
解決了障礙后,就要開始識(shí)別文件的編碼了,通過使用ADODB.Stream對(duì)象來讀取文件的開始兩個(gè)字節(jié),然后根據(jù)這兩個(gè)字節(jié)就可以判斷文件編碼是什么了。
UTF-8文件如果帶BOM的話,那么頭兩個(gè)字節(jié)就是0xEF、0xBB,再例如Unicode文件的開始兩個(gè)字節(jié)是0xFF、0xFE,這些就是判斷文件編碼的依據(jù)。
需要注意的是,在ADODB.Stream讀取字符時(shí),并不是一一對(duì)應(yīng)的,也就是說,如果二進(jìn)制數(shù)據(jù)是0xEF,讀取出來的字符經(jīng)過charCodeAt之后,并不是0xFE,而是另外的值,這個(gè)對(duì)應(yīng)表可以在上面提到的文章里查到。
程序代碼:
復(fù)制代碼 代碼如下:
function CheckEncoding(filename) {
var stream = new ActiveXObject("ADODB.Stream");
stream.Mode = 3;
stream.Type = 2;
stream.Open();
stream.Charset = "437";
stream.LoadFromFile(filename);
var bom = escape(stream.ReadText(2));
switch(bom) {
// 0xEF,0xBB => UTF-8
case "%u2229%u2557":
encoding = "UTF-8";
break;
// 0xFF,0xFE => Unicode
case "%A0%u25A0":
// 0xFE,0xFF => Unicode big endian
case "%u25A0%A0":
encoding = "Unicode";
break;
// 判斷不出來就使用GBK,這樣可以在大多數(shù)情況下正確處理中文
default:
encoding = "GBK";
break;
}
stream.Close();
delete stream;
stream = null;
return encoding;
}
這樣,在需要的時(shí)候,通過調(diào)用CheckEncoding函數(shù)就可以獲取文件的編碼了。
希望此文對(duì)你有所幫助。
相關(guān)文章
JS實(shí)現(xiàn)超簡(jiǎn)潔網(wǎng)頁title標(biāo)題跑動(dòng)閃爍提示效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)超簡(jiǎn)潔網(wǎng)頁title標(biāo)題跑動(dòng)閃爍提示效果代碼,涉及JavaScript結(jié)合定時(shí)函數(shù)動(dòng)態(tài)操作頁面元素屬性的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10JavaScript this指向相關(guān)原理及實(shí)例解析
這篇文章主要介紹了JavaScript this指向相關(guān)原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Selenium執(zhí)行Javascript腳本參數(shù)及返回值過程詳解
這篇文章主要介紹了Selenium執(zhí)行Javascript腳本參數(shù)及返回值過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04js實(shí)現(xiàn)隨機(jī)點(diǎn)名功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)隨機(jī)點(diǎn)名功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12Javascript函數(shù)式編程簡(jiǎn)單介紹
什么是函數(shù)式編程?根據(jù)百度百科的描述,“函數(shù)式編程是種編程典范,它將電腦運(yùn)算視為函數(shù)的計(jì)算。函數(shù)編程語言最重要的基礎(chǔ)是 λ 演算(lambda calculus)。而且λ演算的函數(shù)可以接受函數(shù)當(dāng)作輸入(參數(shù))和輸出(返回值)。”2015-10-10js常用方法、檢查是否有特殊字符串、倒序截取字符串操作完整示例
這篇文章主要介紹了js常用方法、檢查是否有特殊字符串、倒序截取字符串操作,結(jié)合完整實(shí)例形式分析了JavaScript字符串轉(zhuǎn)換、檢測(cè)、倒序、截取等相關(guān)操作技巧,需要的朋友可以參考下2020-01-01