34.10.1 编码系统基础概念

字符编码转换(Character code conversion)是指在 Emacs 内部使用的字符表示形式与其他某种编码之间进行转换。 Emacs 支持多种不同的编码,能够与这些编码相互转换。例如,它可以与 Latin 1、Latin 2、Latin 3、Latin 4、Latin 5 以及若干种 ISO 2022 变体编码进行文本转换。在某些场景下,Emacs 对同一套字符支持多种可选编码; 例如,西里尔字母(俄语)有三种编码系统:ISO、Alternativnyj 和 KOI8。

每个编码系统都指定了一组特定的字符编码转换规则,但编码系统 undecided 比较特殊: 它不预先指定转换方式,而是在对文件或字符串进行解码、编码时,根据其数据自动推断选择合适的转换方式。 编码系统 prefer-utf-8undecided 类似,但会优先选择 utf-8

一般来说,编码系统不保证往返一致性: 使用某编码系统解码一段字节序列后,再用同一编码系统对结果文本编码,可能会得到不同的字节序列。 但部分编码系统可以保证最终字节序列与原始解码内容一致,例如:

iso-8859-1, utf-8, big5, shift_jis, euc-jp

对缓冲区文本编码后再解码,也可能无法还原出原始文本。 例如,使用不支持某字符的编码系统对该字符编码,结果不可预测, 因此再用同一编码系统解码时可能得到不同文本。 目前,Emacs 不会对编码不支持字符所产生的错误进行提示。

行尾转换(End of line conversion)用于处理不同系统中表示文件行结束的三种惯例。 GNU、Unix 系统以及 macOS 使用的是 Unix 惯例,采用换行符(也称为新行)。 MS-Windows 和 MS-DOS 系统使用的是 DOS 惯例,采用回车符加换行符。 经典 Mac OS 使用的 Mac 惯例仅使用回车符,如今在旧软件之外已很少见。

基础编码系统(Base coding systems)(如 latin-1)不指定行尾转换方式,而是根据数据自动选择。 变体编码系统(Variant coding systems)(如 latin-1-unixlatin-1-doslatin-1-mac) 会同时显式指定行尾转换方式。大多数基础编码系统都有三种对应的变体, 名称通过添加 ‘-unix’、‘-dos’ 和 ‘-mac’ 构成。

编码系统 raw-text 比较特殊,它会禁止字符编码转换, 并使使用该编码系统打开的缓冲区为单字节缓冲区。 由于历史原因,使用该编码系统可以保存单字节和多字节文本。 当使用 raw-text 编码多字节文本时,会执行一次字符编码转换: 将八位字符转换为对应的单字节外部表示。 raw-text 不指定行尾转换,由数据按常规方式决定, 同时也具备指定行尾转换的三种标准变体。

no-conversion(及其别名 binary)等价于 raw-text-unix: 它指定不进行任何字符编码或行尾转换。

编码系统 utf-8-emacs 指明数据采用 Emacs 内部编码表示(see 文本表示方式)。 它与 raw-text 类似,不进行编码转换,但区别在于结果为多字节数据。 名称 emacs-internalutf-8-emacs-unix 的别名 (因此它强制不进行行尾转换,而 utf-8-emacs 可解码全部三种行尾惯例)。 由于该编码系统能够表示 Emacs 缓冲区和字符串中支持的所有字符, 建议在保存内部用途文本(如缓存)时使用。

Function: coding-system-get coding-system property

该函数返回编码系统 coding-system 的指定属性。 多数编码系统属性供内部使用,不过你可能会用到 :mime-charset 这一属性。 该属性的值是 MIME 中该编码系统可读写的字符编码名称,示例:

(coding-system-get 'iso-latin-1 :mime-charset)
     ⇒ iso-8859-1
(coding-system-get 'iso-2022-cn :mime-charset)
     ⇒ iso-2022-cn
(coding-system-get 'cyrillic-koi8 :mime-charset)
     ⇒ koi8-r

:mime-charset 属性的值同时也被定义为该编码系统的别名。

Function: coding-system-aliases coding-system

该函数返回 coding-system 的别名列表。