| 編碼 | 代碼點範圍 | 位元組長度 | 位序 | 適用場景 |
|---|---|---|---|---|
| UTF-8 | U+0000 ~ U+10FFFF | 1-4 bytes | Big-endian (網路序) | Web、檔案儲存、網路傳輸 (預設) |
| UTF-16 LE | U+0000 ~ U+10FFFF | 2/4 bytes | Little-endian (Windows 內部) | .NET string 內部、Windows API |
| UTF-16 BE | 同上 | 2/4 bytes | Big-endian | 網路協定、Java 內部 |
| UTF-32 | 同上 | 4 bytes 固定 | LE/BE | 隨機存取、字元計數 O(1) |
// .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,實為 ANSI | new StreamReader(fs, Encoding.GetEncoding(950)) |
| 網頁 Meta Charset 不符 | HTTP Header 與 HTML Meta 衝突 | 統一 UTF-8,Header 優先 |
| 資料庫儲存亂碼 | 欄位 Collation / Connection String 字元集不匹配 | 資料庫/表/欄位/連線字串全 UTF-8 (utf8mb4) |
// 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);
Alt + 小鍵盤輸入十進位代碼 → 系統依當前 Code Page (通常 CP950/CP936/CP1252) 解碼 → 產生字元。
29482 在 CP950 為 "豬" (雙位元組: 0xA4 0x7A),在 CP1252 為不同字元。此為 legacy 相容行為,現代應用請使用 Unicode 輸入法。




