34.10.6 为单次操作指定编码系统

你可以通过绑定变量 coding-system-for-read 和/或 coding-system-for-write,为特定操作指定编码系统。

Variable: coding-system-for-read

若该变量非 nil,则指定读取文件或同步子进程输入时使用的编码系统。

它同样适用于异步子进程或网络流,但方式不同: 启动子进程或打开网络流时 coding-system-for-read 的值, 会指定该子进程或网络流的输入解码方式, 并在被覆盖之前一直生效。

正确使用该变量的方式是通过 let 为特定 I/O 操作进行绑定。 其全局值通常为 nil,不应全局设为其他值。 以下是正确使用示例:

;; 以不进行字符编码转换的方式读取文件。
(let ((coding-system-for-read 'no-conversion))
  (insert-file-contents filename))

当该变量值非 nil 时,其优先级高于所有其他指定输入编码的方式, 包括 file-coding-system-alistprocess-coding-system-alist 以及 network-coding-system-alist

Variable: coding-system-for-write

用法与 coding-system-for-read 基本一致,区别在于它作用于输出而非输入。 它影响文件写入、向子进程与网络连接发送输出, 还用于编码 Emacs 调用子进程时的命令行参数。

当单个操作同时执行输入与输出时(如 call-process-regionstart-process), coding-system-for-readcoding-system-for-write 会同时生效。

Variable: coding-system-require-warning

coding-system-for-write 绑定为非 nil 值后, 会阻止输出底层函数调用 select-safe-coding-system-function 指定的函数(see 用户选择的编码系统s)。 原因是 C-x RET cuniversal-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-writenil。 或者,在使用指定编码前显式调用 select-safe-coding-system

User Option: inhibit-eol-conversion

当该变量非 nil 时,无论指定何种编码系统,均不执行行尾转换。 该设置适用于所有 Emacs I/O 与子进程底层函数, 以及显式编码和解码函数(see 显式编码与解码)。

有时你需要为某操作优先使用多个编码系统,而非固定单一编码。 Emacs 允许你指定编码系统的优先级顺序, 该顺序会影响 find-coding-systems-region 等函数返回的编码系统列表排序(see Lisp中的编码系统)。

Function: coding-system-priority-list &optional highestp

该函数按当前优先级顺序返回编码系统列表。 可选参数 highestpnil 时,仅返回优先级最高的编码系统。

Function: set-coding-system-priority &rest coding-systems

该函数将 coding-systems 置于编码系统优先级列表开头, 使其优先级高于其他所有编码系统。

Macro: with-coding-priority coding-systems &rest body

该宏执行 body(用法类似 progn,see progn), 执行期间 coding-systems 位于编码系统优先级列表前端。 coding-systems 应为执行 body 时优先使用的编码系统列表。