一開始使用ASCII編碼來讀取文本資料,類比讀取位元據,但是發現如果字元編碼大於127時,只會得到小於128的值,相當於和128取餘了,因此ASCII編碼是不行的。
繼續尋找,在CodeProejct.com找到一篇文章《Reading And Writing Binary Files Using JScript》,裡面剛好有我需要的內容。
其實說來也簡單,就是把編碼換一下,使用437,這個是IBM擴充過的ASCII編碼,把ASCII編碼的最高位也利用起來,將字元集中的字元從128個擴充到256個,而使用這個字元集讀取的字元資料就相當於原始位元據了。
解決了障礙後,就要開始識別檔案的編碼了,通過使用ADODB.Stream對象來讀取檔案的開始兩個位元組,然後根據這兩個位元組就可以判斷檔案編碼是什麼了。
UTF-8檔案如果帶BOM的話,那麼頭兩個位元組就是0xEF、0xBB,再例如Unicode檔案的開始兩個位元組是0xFF、0xFE,這些就是判斷檔案編碼的依據。
需要注意的是,在ADODB.Stream讀取字元時,並不是一一對應的,也就是說,如果位元據是0xEF,讀取出來的字元經過charCodeAt之後,並不是0xFE,而是另外的值,這個對應表可以在上面提到的文章裡查到。
程式碼:
複製代碼 代碼如下:
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,這樣可以在大多數情況下正確處理中文
default:
encoding = "GBK";
break;
}
stream.Close();
delete stream;
stream = null;
return encoding;
}
這樣,在需要的時候,通過調用CheckEncoding函數就可以擷取檔案的編碼了。
希望此文對你有所協助。