当 Emacs 将进程输出直接写入多字节缓冲区时,会根据进程输出编码系统对输出进行解码。如果编码系统为 raw-text 或 no-conversion,Emacs 会使用 string-to-multibyte 将单字节输出转换为多字节,并插入生成的多字节文本。
你可以使用 set-process-coding-system 指定所用的编码系统(see 进程信息)。若未指定,则编码系统取自 coding-system-for-read(当其非 nil 时);否则取自默认机制(see 默认编码系统)。如果进程输出的文本包含空字节,Emacs 默认会使用 no-conversion 处理;如何控制该行为参见 inhibit-null-byte-detection。
警告: 像 undecided 这类根据数据自身判断编码的系统,在异步子进程输出场景下并非完全可靠。原因是 Emacs 必须在异步子进程输出到达时分批处理,每次只能尝试从单个数据块检测合适的编码,这并不总能生效。因此,只要可能,应明确指定一个同时确定字符编码转换与行尾转换的编码系统——例如 latin-1-unix,而非 undecided 或 latin-1。
Emacs 调用进程过滤器函数时,会根据进程的过滤器编码系统,将进程输出以多字节字符串或单字节字符串的形式提供。Emacs 依据进程输出编码系统解码输出,通常生成多字节字符串,binary、raw-text 等编码系统除外。