同一個 .txt 文件,用「記事本」打開顯示亂碼/錯誤,用「寫字板」打開卻正常。字體設置相同,為何渲染結果截然不同?
| 特性 | 記事本 | 寫字板 |
|---|---|---|
| 編碼檢測 | 極簡:僅識別 UTF-8/UTF-16 BOM,無 BOM 默認 ANSI (系統代碼頁) | 智能:多字節字符統計、字體關聯、語言檢測,支持 UTF-8 無 BOM、GBK、Big5 等 |
| 渲染引擎 | GDI (Edit 控件),字體回退有限 | RichEdit / DirectWrite,支持複雜腳本、字體回退鏈 |
| 字體關聯 | 無 | 自動關聯中文字體(如 SimSun、Microsoft YaHei) |
記事本的「字體設置」僅影響顯示用什麼字體畫字形,不影響編碼解碼。若文件實際為 UTF-8 無 BOM,記事本按 ANSI (CP936) 解碼 → 字節序列被誤解析 → 顯示錯誤字符 → 再用設置字體渲染錯誤字符。寫字板正確識別為 UTF-8 → 解碼正確 → 字體渲染正確。
file -i filename.txt (Linux/Mac) 或 chcp 65001 && type filename.txt (Win 終端)。files.encoding: "utf8bom")。// C/C++ 寫入帶 BOM 的 UTF-8
FILE* fp = fopen("data.txt", "wb");
fwrite("\xEF\xBB\xBF", 1, 3, fp); // 寫入 BOM
fwrite(utf8_str, 1, len, fp);
fclose(fp);
// Python 3 讀取自動處理 BOM
with open('data.txt', 'r', encoding='utf-8-sig') as f: // -sig 自動剝離 BOM
content = f.read()
「記事本亂碼、寫字板正常」本質是編碼檢測能力差異導致的解碼錯誤,非字體問題。強制使用 UTF-8 with BOM 存儲、編程顯式指定編碼,可從源頭消除跨編輯器顯示不一致。