[.NET]透過StreamReader.CurrentEncoding讀取檔案的編碼
最近在查一個檔案編碼的問題,原本產品的報表在繁體中文的環境上運作都很正常,但是當使用者的作業系統換成了日文,報表出來就變成了亂碼!
原來是因為產品在開啟報表文字檔時,預設是使用「System.Text.Encoding.Default」來開啟,然後再將它轉成Utf8編碼!
在繁體中文的OS中,Encoding.Default.BodyName的值為 big5。
但在日文的OS中,Encoding.Default.BodyName的值為 iso-2022-jp。
所以原本檔案是 big5 編碼,但卻使用 iso-2022-jp 編碼方式來讀取,最後整個文件都亂掉了!
後來網路上說其實可以透過 StreamReader.CurrentEncoding 來讀取正確的檔案編碼,
所以可以參考「存取文字檔與語系編碼問題」的方式,先偵測檔案是否為UTF-8、Little-Endian Unicode 和 Big-Endian Unicode編碼,否則就用big5編碼來開啟。
而透過 StreamReader.CurrentEncoding 取得檔案編碼之前,要先讀取(如Read, ReadToEnd ..... 等等)。
因為 big5 並沒有BOM可以判斷,所以才要使用這樣的方式!
如果沒有使用new StreamReader(fs, Encoding.GetEncoding(950), true)的話,您會發現,如果檔案編碼為big5的話,StreamReader.CurrentEncoding的值都是會UTF-8哦!
測試程式如下,
//using System.IO;
//using System.Text;
string vstrFormFile = textBox1.Text;
using (FileStream fs = File.Open(vstrFormFile, FileMode.Open, FileAccess.Read, FileShare.Read))
{
//http://msdn.microsoft.com/zh-tw/library/ms143457(v=vs.80).aspx
using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(950), true))
{
sr.Read();
MessageBox.Show(sr.CurrentEncoding.BodyName.ToString());
sr.Close();
}
fs.Close();
}
//MessageBox.Show(System.Text.Encoding.Default.BodyName);
所以,當檔案為UTF-8編碼,上面的範例就會顯示 utf-8 。當檔案為big5編碼,上面的範例就會顯示 big5 。
參考資料
StreamReader 建構函式 (Stream, Encoding, Boolean)
StreamReader.CurrentEncoding 屬性
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^