1. 程式人生 > >Windows 記事本的 ANSI、Unicode、UTF-8 這三種編碼模式有什麼區別?

Windows 記事本的 ANSI、Unicode、UTF-8 這三種編碼模式有什麼區別?

簡答。一些細節暫無精力查證,如果說錯了還請指出。

一句話建議:涉及相容性考量時,不要用記事本,用專業的文字編輯器儲存為不帶 BOM 的 UTF-8

如果是為了跨平臺相容性,只需要知道,在 Windows 記事本的語境中:所謂的「ANSI」指的是對應當前系統 locale 的遺留(legacy)編碼。[1]所謂的「Unicode」指的是帶有 BOM 的小端序 UTF-16。[2]所謂的「UTF-8」指的是帶 BOM 的 UTF-8。[3]

GBK 等遺留編碼最麻煩,所以除非你知道自己在幹什麼否則不要再用了。
UTF-16 理論上其實很好,位元組序也標明瞭,但 UTF-16 畢竟不常用。
UTF-8 本來是相容性最好的編碼但 Windows 偏要加 BOM 於是經常出問題。

所以,跨平臺相容性最好的其實就是不用記事本。
建議用 Notepad++ 等正常的專業文字編輯器儲存為不帶 BOM 的 UTF-8。

另外,如果文字中所有字元都在 ASCII 範圍內,那麼其實,記事本儲存的所謂的「ANSI」檔案,和 ASCII 或無 BOM 的 UTF-8 是一樣的。

關於字符集(character set)和編碼(encoding),某幾篇答案中似乎有些混淆。

對於 ASCII、GB 2312、Big5、GBK、GB 18030 之類的遺留方案來說,基本上一個字符集方案只使用一種編碼方案。

比如 ASCII 這部標準本身就直接規定了字元和字元編碼的方式,所以既是字符集又是編碼方案;而 GB 2312 只是一個區位碼形式的字符集標準,不過實際上基本都用 EUC-CN 來編碼,所以提及「GB 2312」時也說的是一個字符集和編碼連鎖的方案;GBK 和 GB 18030 等向後兼容於 GB 2312 的方案也類似。

於是,很多人受這些遺留方案的影響而無法理解字符集和編碼的關係。

對於 Unicode,字符集和編碼是明確區分的。Unicode/UCS 標準首先是個統一的字符集標準。而 Unicode/UCS 標準同時也定義了幾種可選的編碼方案,在標準文件中稱作「encoding form」,主要包括 UTF-8、UTF-16 和 UTF-32。

所以,對 Unicode 方案來說,同樣的基於 Unicode 字符集的文字可以用多種編碼來儲存、傳輸。
所以,用「Unicode」來稱呼一個編碼方案不合適,並且誤導。

[1] Windows 裡說的「ANSI」其實是 Windows code pages,這個模式根據當前 locale 選定具體的編碼,比如簡中 locale 下是 GBK。把自己這些 code page 稱作「ANSI」是 Windows 的臭毛病。在 ASCII 範圍內它們應該是和 ASCII 一致的。

[2] 把帶有 BOM 的小端序 UTF-16 稱作「Unicode」也是 Windows 的臭毛病。Windows 從 Windows 2000 開始就已經支援 surrogate pair 了,所以已經是 UTF-16 了,「UCS-2」這個說法已經不合適了。UCS-2 只能編碼 BMP 範圍內的字元,從 1996 年起就在 Unicode/ISO 標準中被 UTF-16 取代了(UTF-16 通過蛋疼的 surrogate pair 來編碼超出 BMP 的字元)。都十多年了,求求大家別再誤稱了……

[3] 把帶 BOM 的 UTF-8 稱作「UTF-8」又是 Windows 的臭毛病。如果忽略 BOM,那麼在 ASCII 範圍內與 ASCII 一致。