斷判文字檔的編碼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();
}
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去判斷,如果無法判斷,就會依照第二個參數預設編碼去讀取.
應用參考 :
參考 :