你可以通过绑定变量 coding-system-for-read 和/或
coding-system-for-write,为特定操作指定编码系统。
若该变量非 nil,则指定读取文件或同步子进程输入时使用的编码系统。
它同样适用于异步子进程或网络流,但方式不同:
启动子进程或打开网络流时 coding-system-for-read 的值,
会指定该子进程或网络流的输入解码方式,
并在被覆盖之前一直生效。
正确使用该变量的方式是通过 let 为特定 I/O 操作进行绑定。
其全局值通常为 nil,不应全局设为其他值。
以下是正确使用示例:
;; 以不进行字符编码转换的方式读取文件。
(let ((coding-system-for-read 'no-conversion))
(insert-file-contents filename))
当该变量值非 nil 时,其优先级高于所有其他指定输入编码的方式,
包括 file-coding-system-alist、
process-coding-system-alist 以及
network-coding-system-alist。
用法与 coding-system-for-read 基本一致,区别在于它作用于输出而非输入。
它影响文件写入、向子进程与网络连接发送输出,
还用于编码 Emacs 调用子进程时的命令行参数。
当单个操作同时执行输入与输出时(如 call-process-region 和 start-process),
coding-system-for-read 与 coding-system-for-write 会同时生效。
将 coding-system-for-write 绑定为非 nil 值后,
会阻止输出底层函数调用 select-safe-coding-system-function 指定的函数(see 用户选择的编码系统s)。
原因是 C-x RET c(universal-coding-system-argument)
正是通过绑定 coding-system-for-write 工作,Emacs 应遵循用户选择。
若 Lisp 程序将 coding-system-for-write 绑定为可能无法安全编码待写入文本的值,
可同时将 coding-system-require-warning 绑定为非 nil 值,
强制输出底层函数调用 select-safe-coding-system-function 的值检查编码,
即便 coding-system-for-write 非 nil。
或者,在使用指定编码前显式调用 select-safe-coding-system。
当该变量非 nil 时,无论指定何种编码系统,均不执行行尾转换。
该设置适用于所有 Emacs I/O 与子进程底层函数,
以及显式编码和解码函数(see 显式编码与解码)。
有时你需要为某操作优先使用多个编码系统,而非固定单一编码。
Emacs 允许你指定编码系统的优先级顺序,
该顺序会影响 find-coding-systems-region 等函数返回的编码系统列表排序(see Lisp中的编码系统)。
该函数按当前优先级顺序返回编码系统列表。
可选参数 highestp 非 nil 时,仅返回优先级最高的编码系统。
该函数将 coding-systems 置于编码系统优先级列表开头, 使其优先级高于其他所有编码系统。