StreamReader 預設編碼為 UTF-8,而非系統 ANSI 代碼頁。直接讀取 GB2312/Big5 編碼的中文文字檔會產生亂碼。
// 方案一:使用系統預設 ANSI 編碼(繁中環境為 Big5,簡中為 GB2312)
StreamReader sr = new StreamReader(@"d:\1.txt", System.Text.Encoding.Default);
string content = sr.ReadToEnd();
sr.Close();
// 方案二:明確指定 GB2312(簡體中文)
StreamReader sr = new StreamReader(@"d:\1.txt", System.Text.Encoding.GetEncoding("gb2312"));
// 方案三:.NET Core / .NET 5+ 需註冊編碼提供者
// using System.Text.Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// Encoding.GetEncoding("gb2312") 才可用
// 系統預設 ANSI
StreamWriter sw = new StreamWriter(@"d:\1.txt", false, System.Text.Encoding.Default);
sw.Write("一二三");
sw.Close();
// 明確指定 GB2312
StreamWriter sw = new StreamWriter(@"d:\1.txt", false, System.Text.Encoding.GetEncoding("gb2312"));
sw.Write("一二三");
sw.Close();
| 場景 | 建議編碼 | 代碼 |
|---|---|---|
| 跨平台、現代應用、Web | UTF-8 (無 BOM) | Encoding.UTF8 |
| Windows 傳統桌面、舊系統互通 | 系統預設 ANSI | Encoding.Default |
| 指定簡體中文舊系統 | GB2312 / GBK | Encoding.GetEncoding("gb2312") |
| 指定繁體中文舊系統 | Big5 | Encoding.GetEncoding("big5") |
Encoding.Default,因跨機器執行結果不一致using 區塊StreamReader/Writer 正確 Dispose,釋放檔案鎖定
Ude.NetStandard、EncodingDetector 庫自動判斷System.Text.Encoding.CodePages NuGet 並註冊 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 才能使用 GB2312/Big5 等舊編碼Encoding.Default 就是 UTF-8 → 錯,它是作業系統當前 ANSI 代碼頁Encoding.Unicode 就是 UTF-8 → 錯,它是 UTF-16 LE