34.10.4 用户选择的编码系统s

Function: select-safe-coding-system from to &optional default-coding-system accept-default-p file

该函数为指定文本选择编码系统, 必要时会询问用户进行选择。通常指定的文本是当前缓冲区中位于 fromto 之间的内容。如果 from 是字符串,则该字符串指定待编码的文本,且 to 会被忽略。

如果指定文本包含原始字节(see 文本表示方式),select-safe-coding-system 会推荐 使用 raw-text 进行编码。

如果 default-coding-systemnil,则优先尝试该编码系统; 若其能够处理该文本, select-safe-coding-system 会直接返回该编码系统。该参数也可以是编码系统列表; 此时函数会逐个尝试其中的编码。尝试完所有列表项后, 会接着尝试当前缓冲区的 buffer-file-coding-system 值(若其不为 undecided),然后是 buffer-file-coding-system 的默认值, 最后是用户最偏好的编码系统——用户可通过命令 prefer-coding-system 进行设置(see Recognizing Coding Systems in The GNU Emacs Manual)。

如果上述编码系统中有一个能够安全编码全部指定文本, select-safe-coding-system 会选中并返回该系统。 否则,它会让用户从可完整编码文本的编码系统列表中选择,并返回用户所选结果。

default-coding-system 也可以是一个首元素为 t、其余元素为编码系统的列表。此时,若列表中无编码系统可处理文本, select-safe-coding-system 会直接询问用户,而不尝试上述三种备选方案。该形式适用于仅检查列表内编码系统的场景。

可选参数 accept-default-p 决定无需用户交互即可选中的编码系统是否可用。 若该参数省略或为 nil,则此类自动选择的结果始终有效。 若其非 nil,则应为一个函数; select-safe-coding-system 会以选中编码系统的基础编码系统为参数调用该函数。 若函数返回 nilselect-safe-coding-system 会拒绝该自动选中的编码系统,并让用户从候选列表中重新选择。

如果变量 select-safe-coding-system-accept-default-pnil,则其应为一个单参数函数。 该函数会替代 accept-default-p,覆盖此参数传入的所有值。

在返回选中的编码系统前,select-safe-coding-system 会执行最后一步检查:确认该编码系统与从文件读取区域内容时应选中的编码是否一致。 (若不一致,可能导致文件后续重新打开与编辑时出现数据损坏。) 通常,select-safe-coding-system 会以 buffer-file-name 作为校验文件,但若 filenil,则使用该文件(此逻辑适用于 write-region 及类似函数)。若检测到明显不一致, select-safe-coding-system 会在选定编码系统前询问用户。

Variable: select-safe-coding-system-function

该变量指定一个函数,当输出操作的默认编码系统无法安全编码文本时, 调用该函数请求用户选择合适的文本编码系统。 该变量的默认值为 select-safe-coding-system。 Emacs 中写入文件的底层函数(如 write-region)或向其他进程发送文本的函数(如 process-send-region)通常会调用该变量指定的函数, 除非 coding-system-for-write 被绑定为非 nil 值(see 为单次操作指定编码系统)。

以下两个函数可用于让用户通过补全功能指定编码系统。See 补全

Function: read-coding-system prompt &optional default

该函数通过迷你缓冲区读取编码系统,以字符串 prompt 为提示信息, 并以符号形式返回编码系统名称。若用户输入为空, 则由 default 指定返回的编码系统,其应为符号或字符串。

Function: read-non-nil-coding-system prompt

该函数通过迷你缓冲区读取编码系统,以字符串 prompt 为提示信息, 并以符号形式返回编码系统名称。若用户尝试输入空内容, 函数会要求用户重新输入。 See 编码系统