判斷文字檔案的編碼方式

斷判文字檔的編碼Encoding方式

  之前寫了一篇[找出純文字檔裡的關鍵字],但當時沒有考慮到文字檔的編碼方式,所以只是用Encoding.Default的編碼方式去讀取,這也造成其它編碼的檔案無法判讀,因為讀進來的檔案會是亂碼,所以這篇就是針對這個問題去做改善.

  這篇所要講的方式也不是100%適用,因為判斷的來源是BOM(Byte order mark),所以沒有BOM的檔案就無法判別,以下就大概介紹怎麼從BOM去判斷檔案的編碼方式,其實這個方式也很簡單.

byte[] header=new byte[4];
Encoding enc=Encoding.Default;
using (FileStream fs = File.Open(openfiledialog.FullName, FileMode.Open,FileAccess.Read))
{
    if (fs.Length > 3)//判斷檔案長度需大於3
    {
  fs.Read(header, 0, 4);//讀取開頭的前4個byte到header的byte array
  //以下幾種編碼的判斷來源,可以參考文章後的參考.
  if ((header[0] == 0xef && header[1] == 0xbb && header[2] == 0xbf))
      enc = Encoding.UTF8;
  else if ((header[0] == 0xfe && header[1] == 0xff))
      enc = Encoding.BigEndianUnicode;
  else if ((header[0] == 0xff && header[1] == 0xfe))
      enc = Encoding.Unicode;//LittleEndianUnicode
  else if ((header[0] == 0 && header[1] == 0 && header[2] == 0xfe && header[3] == 0xff) ||
     (header[0] == 0xff && header[1] == 0xfe && header[2] == 0 && header[3] == 0))
      enc = Encoding.UTF32;
  else
      enc = Encoding.Default;
    }

    else
    {
  enc = Encoding.Default;
    }

    fs.Close();
}

從前4個byte就可以知道這個文字檔案的編碼方式,這也是為什麼沒有BOM的檔案就會有判斷上的困難.

 

另外在StreamReader也可提供此一自動判斷的功能.

StreamReader sr=new StreamReader(openfilediaplog.FullName,Encoding.Default,true);

第一個帶入的參數是檔案路徑,第二個是預設的編碼方式,第三個Boolean是使用BOM去判斷,如果無法判斷,就會依照第二個參數預設編碼去讀取.

 

應用參考 :

找出純文字檔裡的關鍵字

參考 :

Wiki BOM (Byte Order Mark)

MSDN Encoding.GetPreamble

MSDN StreamReader 建構函式