none
如何預先判斷檔案編碼 ? RRS feed

  • 問題

  • 我現在寫一個批次處理的程式
    就是把某個資料夾下面的所有網頁都加上一段文字
    但是這些網頁 有些是UTF8 有些是BIG5

    我用StreamReader讀取檔案的時候
    編碼格式使選Encoding.Default
    然後再用StreamWriter回存
    就會造成回存的檔案會有亂碼

    所以我想請問各位高手
    怎樣先判斷檔案的編碼格式
    用StreamReader的時候 就可以知道設定哪個編碼格式
    而不會有亂碼

    謝謝各位...
    2007年8月17日 上午 03:44

解答

  • HI,

     

    先讀兩個Byte來判斷:

     

    unicode Little Endian = "\xFF\xFE"
    unicode Big Endian = "\xFE\xFF"
    utf8 = "\xEF\xBB"
    ASCII = 檔案的內容

     

    tihs

    2007年8月17日 上午 04:01
  • 沒有加的就不能被判別,除非你有意去做類似破密的動作,針對檔案內容做資料統計後,歸納可能的編碼,但這樣也是會錯的。

     

    註:utf8 的檔頭是 unicode 編碼過後的檔頭,所以 2 bytes -> 3 bytes ,為:EF BB BF

    2007年8月17日 上午 05:45
    版主

所有回覆

  • HI,

     

    先讀兩個Byte來判斷:

     

    unicode Little Endian = "\xFF\xFE"
    unicode Big Endian = "\xFE\xFF"
    utf8 = "\xEF\xBB"
    ASCII = 檔案的內容

     

    tihs

    2007年8月17日 上午 04:01
  •  

    可是阿

    您說的這個是去讀BOM

    我有看過有些文章在說這塊

    說~~ 有些UTF8的檔案 並沒有被加上BOM

     

    2007年8月17日 上午 04:04
  • 沒有加的就不能被判別,除非你有意去做類似破密的動作,針對檔案內容做資料統計後,歸納可能的編碼,但這樣也是會錯的。

     

    註:utf8 的檔頭是 unicode 編碼過後的檔頭,所以 2 bytes -> 3 bytes ,為:EF BB BF

    2007年8月17日 上午 05:45
    版主
  •  

    那怎辦ㄋ

    沒先預先判斷是什麼編碼

    開啟以後會變亂碼

    回存就整個亂掉

     

    一般在寫文字編輯器的時候不會遇到這個問題嗎?

    怎麼很少看到有人問這塊...

     

    2007年8月17日 上午 07:08
  • 因為一般都是用檔頭判別,檔頭沒有的就當成 ANSI ,也就是 this 大說的。

     

    先前有人討論過,就是再談慣用字與意判別,不過我覺得應該回歸密碼學的根本,先找常用關鍵字來猜編碼,既然是猜編碼,當然就有猜錯的可能。

    2007年8月17日 上午 07:12
    版主
  •  

    是歐

    那像用NOTEPAD開啟文字檔阿

    他就會預先幫你判斷是哪種編碼格式

    這樣開啟在編輯區的地方就不會有亂碼

    這應該也是在開檔過程中 先判斷此檔是什麼編碼類型

    在開啟ㄅ

     

    那表示這應該是不難可以做到的動作ㄅ....

    怎麼搞得好像很難判斷是什麼編碼類型似的...
    2007年8月17日 上午 07:16
  • 不就說是檔頭了嘛?哪有很複雜?

     

    你有把這些文字檔用二進位模式開啟觀察過嗎?

     

    電腦只接受程式開發者的命令,並不會自動判斷任何事。對於電腦來說,文字檔二進位檔都是相同的意義,所以要由程式開發者告訴電腦那是什麼東西,檔頭則是大家用來交換訊息描述這是什麼檔的標記,程式設計師就可以依照這個邏輯告訴電腦要怎樣轉碼。

     

    沒有檔頭的文字檔,你都搞不清楚的東西電腦怎麼會知道?

     

    程式開發者自己要先搞清楚邏輯,自己搞不清楚請先研究清楚。

     

    另外本版公告:張貼文章應注意事項及應提供資訊 有提到:

    提問時,也請千萬拜託,除語氣詞、表達對網友的尊崇時,千萬不要用注音文或火星文,當然也包含其他罕用詞或特殊縮寫。程式語言討論需用字精確,往往差一字就差很遠,所以在這種情況下再讓網友猜,只是浪費彼此的時間。

     

    請避免使用注音文。純使用中文就已經有點雞同鴨講了,不要再增加大家的困惑。

    2007年8月17日 上午 07:26
    版主
  •  

    歐歐

    不好意思

    因為我打太急了

    沒有去檢查自己打得有沒有錯

     

    還有阿

    我知道是黨頭阿

    我的意思是說阿

    有些沒有黨頭的UTF8

    好像還是會被判讀成UTF8也

     

    所以我才會覺得 用黨頭來判別

    好像不很精準

     

    請大大見諒  別生氣...

    2007年8月17日 上午 07:31
  • 那麼請去搞清楚編碼的實質內容。

     

    英數預設用 utf8 encoding / decoding 是不會受到影響的,但若你的檔案是 big5 / gb2312 等編碼,用 utf8 解則會出問題。

     

    當你搞清楚 utf8 的編碼精神與用途後,你會得到一個結論,所有用 utf8 編碼的每一個 byte 將不會超過 128 ,若所有 byte 均小於 128 時,可假設成兩種狀況:1. 原始為 ANSI 純英數,2. utf8 的多國語言。

     

    狀況1 : 純英數通常不含控制碼,則做 utf8 decoding 會得到相同結果,無礙。

    狀況2 : 多國語言,正常。

     

    所以才會發生有開發者拿這種狀況當預設值。

     

    會不會有例外?會。

    此外所有 Byte 的檢查,也浪費效能。

     

    所以不會每個人都拿來當通解。

     

    所以即便是 IE ,在沒有足夠資訊的前提下,也常會猜錯編碼。

     

    常用來當作預設編碼的,自然以 ANSI 為最大宗,少數才用 Unicode / UTF8 。

    2007年8月17日 上午 07:50
    版主
  • 用檔頭判斷才是最精準的,檔頭告訴你這是什麼格式檔案時,如果不對,哪表示資料來源就有問題。

     

    用內容判斷編碼,都是用猜的。

     

    上課的時候老師告訴你答案是 A ,你認為不精準,用猜的比較精準嗎?

    檔頭告訴你它的編碼時,你認為不精準,用猜的比較準嗎?

     

    ABCDE

    可能是用哪種編碼?有太多可能了,幾乎現有的編碼都有可能,所以猜 ANSI / Big5 / UTF8 都有可能,你只能猜相容度最大或是最常用的編碼,比如說本機非 Unicode 預設編碼、UTF8 等。

     

    猜的永遠不會比直接告訴你的精準,只有沒告訴你的情況下,也就是無檔頭時,你必須猜。

    你猜的方式就是兩種,本機預設編碼 (繁中為 big5) 跟相容度最大,而相容度最大就要去做語意分析,否則沒辦法判斷他跟哪種編碼相容度最大。

    2007年8月18日 上午 02:39
    版主
  • 你好,不知你要的功能後來有達成嗎?
    我最近也有這需求 ,不管檔案有無 BOM 都要能正常判斷編碼
    若你還沒找到解法,我放在我部落格裡供參考
    雖然用php 寫的 但原理一樣,希望對你有所幫助
    tw.myblog.yahoo.com/taka-yahoo/article?mid=437

     

    2010年12月10日 上午 03:52
  • 那檔案格式若不是 big5 / utf8 兩種時...

    例如純英文構成的 utf7 / utf8 / utf16 / utf32 ...


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年12月10日 下午 12:54