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

C# ASCII 與 Unicode 編碼深度解析:字元編碼原理、轉換實作與常見亂碼排查

     編輯:關於C#

字元編碼基礎概念

  • 字元集:字元與代碼點對應表 (如 Unicode 代碼點 U+4E2D = "中")
  • 編碼:代碼點 → 位元組序列的規則 (UTF-8: 1-4 bytes, UTF-16: 2/4 bytes)
  • ASCII:7-bit (0-127),僅涵蓋基本拉丁字母、數字、符號
  • Code Page:擴展 ASCII (128-255) 對應不同語系 (Big5=CP950, GB2312=CP936)

Unicode 編碼形式比較

編碼代碼點範圍位元組長度位序適用場景
UTF-8U+0000 ~ U+10FFFF1-4 bytesBig-endian (網路序)Web、檔案儲存、網路傳輸 (預設)
UTF-16 LEU+0000 ~ U+10FFFF2/4 bytesLittle-endian (Windows 內部).NET string 內部、Windows API
UTF-16 BE同上2/4 bytesBig-endian網路協定、Java 內部
UTF-32同上4 bytes 固定LE/BE隨機存取、字元計數 O(1)

C# 字串內部與編碼轉換

// .NET string 內部為 UTF-16 LE (char = 16-bit)
string s = "中文";
foreach (char c in s) {
    Console.WriteLine($"U+{(int)c:X4}"); // U+4E2D, U+6587
}

// 編碼轉換核心 API
byte[] utf8 = Encoding.UTF8.GetBytes(s);        // 字串 → UTF-8 位元組
byte[] big5 = Encoding.GetEncoding(950).GetBytes(s); // 字串 → Big5
string fromUtf8 = Encoding.UTF8.GetString(utf8);     // 位元組 → 字串

// 串流轉換 (大檔案)
using (var fs = File.OpenRead("big5.txt"))
using (var sr = new StreamReader(fs, Encoding.GetEncoding(950)))
using (var sw = new StreamWriter("utf8.txt", false, Encoding.UTF8)) {
    string line;
    while ((line = sr.ReadLine()) != null) sw.WriteLine(line);
}

常見亂碼場景與排查

現象原因解決
中文顯示 ??? 或 □字型缺少字符、編碼錯誤導致代碼點錯誤確認字型支援、指定正確 Encoding
顯示 鍵盤 縮寫 亂碼UTF-8 位元組以 Big5/CP950 解碼來源端指定 UTF-8、接收端同步
檔案讀取亂碼StreamReader 預設 UTF-8,實為 ANSInew StreamReader(fs, Encoding.GetEncoding(950))
網頁 Meta Charset 不符HTTP Header 與 HTML Meta 衝突統一 UTF-8,Header 優先
資料庫儲存亂碼欄位 Collation / Connection String 字元集不匹配資料庫/表/欄位/連線字串全 UTF-8 (utf8mb4)

BOM (Byte Order Mark) 處理

// UTF-8 BOM: EF BB BF
// UTF-16 LE BOM: FF FE
// UTF-16 BE BOM: FE FF

// 讀取時自動偵測 BOM
using (var sr = new StreamReader("file.txt", true)) { // detectEncodingFromByteOrderMarks = true
    // 已自動跳過 BOM、選擇正確 Encoding
}

// 寫入不含 BOM (Web 標準)
var utf8NoBom = new UTF8Encoding(false); // encoderShouldEmitUTF8Identifier = false
File.WriteAllText("file.txt", content, utf8NoBom);

QQ Alt+數字鍵輸入原理

Alt + 小鍵盤輸入十進位代碼 → 系統依當前 Code Page (通常 CP950/CP936/CP1252) 解碼 → 產生字元。
29482 在 CP950 為 "豬" (雙位元組: 0xA4 0x7A),在 CP1252 為不同字元。此為 legacy 相容行為,現代應用請使用 Unicode 輸入法。

ASCII表
Unicode平面
UTF-8編碼
轉換範例1
轉換範例2

本文對應《叩響 C# 之門》第 2.3.5 節 ASCII編碼和Unicode編碼教學內容

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