首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# Encoding 編碼詳解:ASCII、UTF-7/8/16/32 差異與選擇指南

     編輯:關於C#

為什麼需要編碼

電腦只識別位元組(0/1),字元(字母、漢字、表情符號)必須透過編碼轉換為位元組序列才能儲存/傳輸。編碼定義了「字元 ↔ 位元組」的對應規則。

字元集 vs 編碼

  • 字元集:給每個字元一個唯一代碼點。如 Unicode 給「中」代碼點 U+4E2D
  • 編碼:將代碼點轉換為位元組序列的規則。UTF-8 將 U+4E2D 編碼為 E4 B8 AD 三個位元組

常見編碼對比

編碼類別.NET 類別位元組/字元支援範圍適用場景
ASCIIASCIIEncoding1 位元組U+0000~U+007F (128 字元)舊系統相容、純英文協定
UTF-7UTF7Encoding1~? 位元組全 Unicode郵件/新聞群組舊協定(不推薦)
UTF-8UTF8Encoding1~4 位元組全 Unicode預設首選、Web、API、檔案、資料庫
UTF-16UnicodeEncoding2 或 4 位元組全 Unicode.NET 內部字串、Windows API、部份檔案格式
UTF-32UTF32Encoding4 位元組全 Unicode需固定寬度字元處理、內部演算法

.NET 核心機制

  • string 內部永遠是 UTF-16(char = 16 位元)
  • Encoding.GetBytes(string):字串 → 位元組陣列(編碼)
  • Encoding.GetString(byte[]):位元組陣列 → 字串(解碼)
  • Encoding.GetEncoder()/GetDecoder():取得可重複使用的編碼器/解碼器(支援流式處理、狀態保持)

為什麼 Microsoft 強烈推薦 UTF-8

  1. 相容 ASCII:U+0000~U+007F 字元編碼與 ASCII 完全相同
  2. 無資料遺失:可表示所有 Unicode 字元,不會像 ASCII 將非支援字元轉為 ?
  3. 安全性:ASCII 第 8 位元模糊性可被惡意利用,UTF-8 無此問題
  4. 效能:.NET 對 UTF-8 高度優化,純 ASCII 內容下比 ASCIIEncoding 更快
  5. 跨平台標準:Linux/macOS/容器/雲端/HTTP/JSON/XML 預設皆為 UTF-8

實務選擇指南

場景推薦編碼備註
新專案、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),永遠顯式指定編碼
  • BOM (Byte Order Mark):UTF-8 BOM 為 EF BB BF,某些工具不支援,建議無 BOM儲存(new UTF8Encoding(false))
  • 雙重編碼:已編碼的位元組再次被當字串編碼,產生亂碼。避免「字串 → 位元組 → 字串 → 位元組」多次轉換
  • 截斷多位元組字元:固定長度截取位元組陣列可能切斷 UTF-8 字元,解碼時產生替換字元 。需按字元截斷或使用 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}");
}

掌握編碼本質,選對工具,避開坑點,是處理文字資料的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved