该函数为指定文本选择编码系统, 必要时会询问用户进行选择。通常指定的文本是当前缓冲区中位于 from 与 to 之间的内容。如果 from 是字符串,则该字符串指定待编码的文本,且 to 会被忽略。
如果指定文本包含原始字节(see 文本表示方式),select-safe-coding-system 会推荐
使用 raw-text 进行编码。
如果 default-coding-system 非 nil,则优先尝试该编码系统;
若其能够处理该文本,
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 会以选中编码系统的基础编码系统为参数调用该函数。
若函数返回 nil,
select-safe-coding-system 会拒绝该自动选中的编码系统,并让用户从候选列表中重新选择。
如果变量 select-safe-coding-system-accept-default-p
非 nil,则其应为一个单参数函数。
该函数会替代 accept-default-p,覆盖此参数传入的所有值。
在返回选中的编码系统前,select-safe-coding-system
会执行最后一步检查:确认该编码系统与从文件读取区域内容时应选中的编码是否一致。
(若不一致,可能导致文件后续重新打开与编辑时出现数据损坏。)
通常,select-safe-coding-system 会以 buffer-file-name
作为校验文件,但若 file 非 nil,则使用该文件(此逻辑适用于 write-region
及类似函数)。若检测到明显不一致,
select-safe-coding-system 会在选定编码系统前询问用户。
该变量指定一个函数,当输出操作的默认编码系统无法安全编码文本时,
调用该函数请求用户选择合适的文本编码系统。
该变量的默认值为 select-safe-coding-system。
Emacs 中写入文件的底层函数(如
write-region)或向其他进程发送文本的函数(如
process-send-region)通常会调用该变量指定的函数,
除非 coding-system-for-write 被绑定为非 nil 值(see 为单次操作指定编码系统)。
以下两个函数可用于让用户通过补全功能指定编码系统。See 补全。
该函数通过迷你缓冲区读取编码系统,以字符串 prompt 为提示信息, 并以符号形式返回编码系统名称。若用户输入为空, 则由 default 指定返回的编码系统,其应为符号或字符串。