本节介绍用于指定特定文件或运行特定子程序时默认编码系统的变量, 以及 I/O 操作用于读取这些配置的函数。
这些变量的设计思路是一次性设置为所需默认值,之后不再修改。
若要在 Lisp 程序中为特定操作指定特定编码系统,
请勿修改这些变量;而是通过
coding-system-for-read 与 coding-system-for-write 进行覆盖(see 为单次操作指定编码系统)。
该变量是一个由文本模式与对应编码系统组成的关联列表。
每个元素格式为 (regexp
. coding-system);若文件前几千字节匹配 regexp,
则在将其内容读入缓冲区时使用 coding-system 解码。
该列表中的设置优先级高于文件中的 coding: 标记
以及 file-coding-system-alist 的内容(见下文)。
默认值会让 Emacs 自动识别 Babyl 格式的邮件文件,并以无编码转换方式读取。
该变量是一个关联列表,用于指定读写特定文件时使用的编码系统。
每个元素格式为
(pattern . coding),其中 pattern 是匹配特定文件名的正则表达式,
该元素适用于匹配 pattern 的文件名。
元素的 CDR 部分 coding 可以是编码系统、包含两个编码系统的 Cons 单元, 或是函数名(带有函数定义的符号)。若 coding 为编码系统, 则该系统同时用于文件的读取与写入。 若 coding 为包含两个编码系统的 Cons 单元,其 CAR 指定解码所用编码系统,CDR 指定编码所用编码系统。
若 coding 为函数名,则该函数应接收一个参数,
即传递给 find-operation-coding-system 的所有参数组成的列表。
函数必须返回一个编码系统或包含两个编码系统的 Cons 单元,
其含义与上述规则一致。
若 coding(或上述函数返回值)为 undecided,
则执行常规的编码检测逻辑。
该变量是一个关联列表,用于指定读写特定文件时使用的编码系统。
其格式与 file-coding-system-alist 相同,
但与后者不同的是,该变量优先级高于文件中的任意 coding: 标记。
该变量是一个关联列表,根据子进程中运行的程序指定所用编码系统。
其工作方式与 file-coding-system-alist 类似,区别在于 pattern
匹配启动子进程时使用的程序名。
该列表中指定的编码系统用于初始化子进程 I/O 所用编码,
但后续可通过 set-process-coding-system 指定其他编码系统。
警告: 诸如 undecided 这类根据数据自身确定编码的系统,
在异步子进程输出场景下无法完全可靠工作。
原因是 Emacs 会按到达批次处理异步子进程输出。
若编码系统未指定字符编码转换或行尾转换方式,
Emacs 只能逐批次尝试检测合适的转换规则,而这并不总能正常工作。
因此,在使用异步子进程时,应尽可能选用同时确定字符编码转换
与行尾转换的编码系统—例如 latin-1-unix,
而非 undecided 或 latin-1。
该变量是一个关联列表,用于指定网络流所用编码系统。
其工作方式与 file-coding-system-alist 非常相似,
区别在于元素中的 pattern 可以是端口号或正则表达式。
若为正则表达式,则会匹配打开网络流时使用的网络服务名。
该变量指定在无其他配置时, 子进程(及网络流)输入与输出所用的编码系统。
其值应为格式为 (input-coding . output-coding) 的 Cons 单元。
其中 input-coding 用于子进程输入,
output-coding 用于子进程输出。
该变量保存一组函数,这些函数会根据文件未解码的内容尝试确定其编码系统。
列表中的每个函数都应查看当前缓冲区中的文本,
但不得对其进行任何修改。缓冲区中会包含文件部分内容。
每个函数应接收一个参数 size,
指定从当前指针位置开始检查的字符数量。
若函数成功确定文件编码系统,则返回该编码系统;
否则返回 nil。
每个函数还可通过变量 auto-coding-file-name
获取缓冲区内容对应的文件名。
该列表中的函数可能在以下时机被调用: 打开文件并需要解码内容时,和/或 文件缓冲区即将保存、Emacs 需要确定编码方式时。
若文件包含 ‘coding:’ 标记,则该标记优先级更高, 这些函数不会被调用。
该函数尝试为 filename 确定合适的编码系统。
它会依次使用上述文档中的变量检查打开该文件的缓冲区,
直到匹配到其中某条规则。随后返回格式为
(coding . source) 的 Cons 单元,
其中 coding 为应使用的编码系统,
source 为符号,取值为 auto-coding-alist、auto-coding-regexp-alist、
:coding 或 auto-coding-functions 之一,
表示匹配规则的来源。值 :coding 表示编码系统由文件中的
coding: 标记指定(see coding tag in The GNU Emacs Manual)。
规则查找顺序为:先 auto-coding-alist,
然后 auto-coding-regexp-alist,接着是 coding: 标记,
最后是 auto-coding-functions。
若未找到匹配规则,函数返回 nil。
第二个参数 size 为指针后文本的字符长度。
函数仅检查指针后 size 范围内的文本。
通常调用该函数时缓冲区应定位在开头,
因为 coding: 标记可出现在文件前一至两行;
此时 size 应设为缓冲区大小。
该函数返回文件 filename 适用的编码系统。
其通过 find-auto-coding 查找编码系统。
若无法确定编码系统,则返回 nil。
参数 size 的含义与 find-auto-coding 中一致。
该函数返回执行带 arguments 参数的 operation 操作时 (默认)应使用的编码系统。返回值格式如下:
(decoding-system . encoding-system)
首元素 decoding-system 为解码所用编码系统(若 operation 执行解码操作), encoding-system 为编码所用编码系统(若 operation 执行编码操作)。
参数 operation 为符号,取值应为 write-region、start-process、
call-process、call-process-region、insert-file-contents
或 open-network-stream 之一。
这些是 Emacs 中可执行字符编码与行尾转换的 I/O 底层函数。
其余参数应与对应 I/O 底层函数接收的参数一致。
根据函数不同,其中一个参数会被选为 目标对象(target)。
例如,若 operation 执行文件 I/O,则指定文件名的参数为目标对象。
对子进程相关函数,进程名为目标对象。
对 open-network-stream,目标对象为服务名或端口号。
根据 operation 的不同,该函数会在
file-coding-system-alist、process-coding-system-alist
或 network-coding-system-alist 中查找目标对象。
若在关联列表中找到目标,find-operation-coding-system
返回其对应关联值;否则返回 nil。
若 operation 为 insert-file-contents,
对应目标的参数可以是格式为 (filename . buffer) 的 Cons 单元。
此时 filename 为在 file-coding-system-alist 中查找的文件名,
buffer 为包含文件内容(尚未解码)的缓冲区。
若 file-coding-system-alist 为此文件指定了需调用的函数,
且该函数需要检查文件内容(通常如此),则应检查 buffer 内容而非读取文件。