[.NET]透過StreamReader.CurrentEncoding判斷檔案的編碼

  • 18891
  • 0
  • .NET
  • 2013-05-21

[.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:從零開始的軟體開發生活

請大家繼續支持 ^_^