字符编码转换(Character code conversion)是指在 Emacs 内部使用的字符表示形式与其他某种编码之间进行转换。 Emacs 支持多种不同的编码,能够与这些编码相互转换。例如,它可以与 Latin 1、Latin 2、Latin 3、Latin 4、Latin 5 以及若干种 ISO 2022 变体编码进行文本转换。在某些场景下,Emacs 对同一套字符支持多种可选编码; 例如,西里尔字母(俄语)有三种编码系统:ISO、Alternativnyj 和 KOI8。
每个编码系统都指定了一组特定的字符编码转换规则,但编码系统 undecided 比较特殊:
它不预先指定转换方式,而是在对文件或字符串进行解码、编码时,根据其数据自动推断选择合适的转换方式。
编码系统 prefer-utf-8 与 undecided 类似,但会优先选择 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-unix、latin-1-dos 和 latin-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-internal 是 utf-8-emacs-unix 的别名
(因此它强制不进行行尾转换,而 utf-8-emacs 可解码全部三种行尾惯例)。
由于该编码系统能够表示 Emacs 缓冲区和字符串中支持的所有字符,
建议在保存内部用途文本(如缓存)时使用。
该函数返回编码系统 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 属性的值同时也被定义为该编码系统的别名。
该函数返回 coding-system 的别名列表。