34.10.3 Lisp中的编码系统

以下是用于处理编码系统的 Lisp 工具:

Function: coding-system-list &optional base-only

该函数返回所有编码系统名称(符号)组成的列表。 如果 base-only 的值非 nil,返回值仅包含基础编码系统; 否则,还会包含别名编码系统和变体编码系统。

Function: coding-system-p object

如果 object 是编码系统名称,该函数返回 t,否则返回 nil

Function: check-coding-system coding-system

该函数检查 coding-system 的有效性。 如果有效,返回 coding-system; 如果 coding-systemnil,函数返回 nil; 对于其他任何值,函数会触发一个错误,其 error-symbolcoding-system-error (see signal)。

Function: coding-system-eol-type coding-system

该函数返回 coding-system 所使用的行尾(也称为 eol)转换类型。 如果 coding-system 指定了某种行尾转换方式,返回值为整数 0、1 或 2, 分别代表 unixdosmac 格式。 如果 coding-system 未显式指定行尾转换方式,返回值为一个编码系统向量, 其中每个编码系统对应一种可能的行尾转换类型,示例如下:

(coding-system-eol-type 'latin-1)
     ⇒ [latin-1-unix latin-1-dos latin-1-mac]

如果该函数返回一个向量,Emacs 会在文本编码或解码过程中确定要使用的行尾转换方式。 解码时,会自动检测文本的行尾格式,并将行尾转换方式设置为与之匹配(例如,DOS 风格的 CRLF 格式会对应 dos 行尾转换); 编码时,行尾转换方式取自相应的默认编码系统(例如,buffer-file-coding-system 的默认值), 或取自底层平台对应的默认行尾转换方式。

Function: coding-system-change-eol-conversion coding-system eol-type

该函数返回一个编码系统,该编码系统除了行尾转换方式由 eol-type 指定外,其余特性均与 coding-system 相同。 eol-type 的取值可以是 unixdosmacnil。 如果取值为 nil,返回的编码系统会根据数据来确定行尾转换方式。

eol-type 也可以取值为 0、1 或 2,分别对应 unixdosmac

Function: coding-system-change-text-conversion eol-coding text-coding

该函数返回一个编码系统,该编码系统使用 eol-coding 的行尾转换方式, 以及 text-coding 的文本转换方式。 如果 text-codingnil,函数返回 undecided, 或根据 eol-coding 返回其某一个变体。

Function: find-coding-systems-region from to

该函数返回可用于编码 fromto 之间文本的编码系统列表。 列表中的所有编码系统都能安全地编码该段文本中的任意多字节字符。

如果该文本不包含任何多字节字符,函数返回列表 (undecided)

Function: find-coding-systems-string string

该函数返回可用于编码 string 文本内容的编码系统列表。 列表中的所有编码系统都能安全地编码 string 中的任意多字节字符。 如果该文本不包含任何多字节字符,函数返回列表 (undecided)

Function: find-coding-systems-for-charsets charsets

该函数返回可用于编码列表 charsets 中所有字符集的编码系统列表。

Function: check-coding-systems-region start end coding-system-list

该函数检查列表 coding-system-list 中的编码系统是否能编码 startend 区域内的所有字符。 如果列表中的所有编码系统都能编码指定文本,函数返回 nil; 如果部分编码系统无法编码某些字符,返回值为一个关联列表(alist), 其中每个元素的格式为 (coding-system1 pos1 pos2 …), 表示 coding-system1 无法编码缓冲区中 pos1pos2 等位置的字符。

如果 start 是一个字符串,那么 end 会被忽略, 返回值中引用的是字符串索引而非缓冲区位置。

Function: detect-coding-region start end &optional highest

该函数为解码 startend 之间的文本选择一个合理的编码系统。 该文本应当是字节序列,即单字节文本,或仅包含 ASCII 字符和八位字符的多字节文本 (see 显式编码与解码)。

通常,该函数返回一个编码系统列表,这些编码系统都能处理扫描到的文本解码, 列表按优先级从高到低排列。 但如果 highest 的值非 nil,返回值则仅为优先级最高的那个编码系统。

如果该区域除了 ESC 等 ISO-2022 控制字符外,只包含 ASCII 字符, 返回值为 undecided(undecided), 如果能从文本中推断出行尾转换方式,则返回指定行尾转换的变体。

如果该区域包含空字节(null bytes),即使区域内包含以某种编码系统编码的文本,返回值也为 no-conversion

Function: detect-coding-string string &optional highest

该函数与 detect-coding-region 功能类似, 区别在于它操作的是 string 的内容,而非缓冲区中的字节。

Variable: inhibit-null-byte-detection

如果该变量的值非 nil,在检测区域或字符串的编码时会忽略空字节。 这使得包含空字节的文本(例如带有索引节点的 Info 文件)的编码能够被正确检测。

Variable: inhibit-iso-escape-detection

如果该变量的值非 nil,在检测区域或字符串的编码时会忽略 ISO-2022 转义序列。 这会导致任何文本都不会被检测为采用 ISO-2022 编码,且所有转义序列都会在缓冲区中可见。 警告: 请极其谨慎地使用该变量,因为 Emacs 发行版中的许多文件都使用 ISO-2022 编码。

Function: coding-system-charset-list coding-system

该函数返回 coding-system 所支持的字符集列表 (see 字符集)。 对于支持过多字符集而无法全部列出的编码系统,会返回特殊值:

  • 如果 coding-system 支持所有 Emacs 字符,返回值为 (emacs)
  • 如果 coding-system 支持所有 Unicode 字符,返回值为 (unicode)
  • 如果 coding-system 支持所有 ISO-2022 字符集,返回值为 iso-2022
  • 如果 coding-system 支持 Emacs 21 版本(在实现内部 Unicode 支持之前)使用的内部编码系统中的所有字符,返回值为 emacs-mule

See Process Information, 特别是其中关于 process-coding-systemset-process-coding-system 函数的描述, 介绍了如何查看或设置用于与子进程进行输入输出(I/O)的编码系统。