電腦只識別位元組(0/1),字元(字母、漢字、表情符號)必須透過編碼轉換為位元組序列才能儲存/傳輸。編碼定義了「字元 ↔ 位元組」的對應規則。
E4 B8 AD 三個位元組| 編碼類別 | .NET 類別 | 位元組/字元 | 支援範圍 | 適用場景 |
|---|---|---|---|---|
| ASCII | ASCIIEncoding | 1 位元組 | U+0000~U+007F (128 字元) | 舊系統相容、純英文協定 |
| UTF-7 | UTF7Encoding | 1~? 位元組 | 全 Unicode | 郵件/新聞群組舊協定(不推薦) |
| UTF-8 | UTF8Encoding | 1~4 位元組 | 全 Unicode | 預設首選、Web、API、檔案、資料庫 |
| UTF-16 | UnicodeEncoding | 2 或 4 位元組 | 全 Unicode | .NET 內部字串、Windows API、部份檔案格式 |
| UTF-32 | UTF32Encoding | 4 位元組 | 全 Unicode | 需固定寬度字元處理、內部演算法 |
string 內部永遠是 UTF-16(char = 16 位元)Encoding.GetBytes(string):字串 → 位元組陣列(編碼)Encoding.GetString(byte[]):位元組陣列 → 字串(解碼)Encoding.GetEncoder()/GetDecoder():取得可重複使用的編碼器/解碼器(支援流式處理、狀態保持)?ASCIIEncoding 更快| 場景 | 推薦編碼 | 備註 |
|---|---|---|
| 新專案、Web API、JSON、XML、設定檔、日誌 | Encoding.UTF8(無 BOM) | 預設最佳 |
| Windows 註冊表、.NET 內部字串互操作 | Encoding.Unicode (UTF-16LE) | 系統原生 |
| 舊系統整合、指定 ASCII 協定 | Encoding.ASCII | 僅限必要時 |
| 需固定字元寬度的演算法/索引 | Encoding.UTF32 | 空間換時間 |
| 讀取未知編碼檔案 | 偵測 BOM → Encoding.GetEncoding("utf-8") 等 | 可用 Ude.NetStandard 自動偵測 |
StreamReader/File.ReadAllText 無參數多載預設為 Encoding.UTF8(.NET Core)或系統預設編碼(.NET Framework),永遠顯式指定編碼EF BB BF,某些工具不支援,建議無 BOM儲存(new UTF8Encoding(false))。需按字元截斷或使用 Decoder 狀態機
// 字串 → UTF-8 位元組(無 BOM)
byte[] utf8Bytes = Encoding.UTF8.GetBytes("中文測試");
// 位元組 → 字串
string text = Encoding.UTF8.GetString(utf8Bytes);
// 指定編碼讀寫檔案
File.WriteAllText(path, content, Encoding.UTF8);
var lines = File.ReadAllLines(path, Encoding.UTF8);
// 偵測 BOM 自動選擇編碼讀取
using (var reader = new StreamReader(path, true)) // detectEncodingFromByteOrderMarks = true
{
var content = reader.ReadToEnd();
Console.WriteLine($"偵測編碼: {reader.CurrentEncoding.WebName}");
}
掌握編碼本質,選對工具,避開坑點,是處理文字資料的基本功。