JScript中使用ADODB.Stream判斷檔案編碼的代碼_javascript技巧

來源:互聯網
上載者:User
一開始使用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函數就可以擷取檔案的編碼了。
希望此文對你有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.