34.10.7 显式编码与解码

所有在 Emacs 内外传输文本的操作,均可使用编码系统对文本进行编码或解码。 你也可以使用本节函数显式编码和解码文本。

编码结果与解码输入并非普通文本, 逻辑上由一系列字节值组成,即一系列 ASCII 与八位字符。 在单字节缓冲区与字符串中,这些字符编码范围为 0 至 #xFF(255)。 在多字节缓冲区或字符串中,八位字符的编码高于 #xFF(see 文本表示方式),但 Emacs 在编码或解码此类文本时,会透明地将其转换为单字节值。

若要将文件以字节序列读入缓冲区以便显式解码, 通常使用 insert-file-contents-literally(see 从文件读取); 或者在使用 find-file-noselect 打开文件时,指定非 nilrawfile 参数。 这些方法会生成单字节缓冲区。

显式编码文本得到的字节序列,通常用于写入文件或发送至进程, 例如通过 write-region 写入(see 写入文件), 并将 coding-system-for-write 绑定为 no-conversion 以禁止自动编码。

以下为执行显式编码或解码的函数。 编码函数生成字节序列,解码函数用于处理字节序列。 所有这些函数都会丢弃文本属性, 并将 last-coding-system-used 设置为实际使用的精确编码系统。

Command: encode-coding-region start end coding-system &optional destination

该命令根据编码系统 coding-systemstartend 的文本进行编码。 通常编码后的文本会替换缓冲区中原内容, 但可选参数 destination 可改变这一行为。 若 destination 为缓冲区,编码文本会插入该缓冲区的指针之后(指针不移动); 若为 t,命令直接返回编码后的单字节字符串而不插入。

若编码文本被插入某缓冲区,命令返回编码文本长度。

编码结果逻辑上为字节序列, 但若原缓冲区为多字节,则编码后仍保持多字节模式, 所有八位字节会转换为多字节表示(see 文本表示方式)。

编码文本时**切勿**将 undecided 用作 coding-system, 否则可能产生意外结果。 若 coding-system 无明显合适值, 应使用 select-safe-coding-system(see select-safe-coding-system)推荐合适编码。

Function: encode-coding-string string coding-system &optional nocopy buffer

该函数根据 coding-systemstring 中的文本编码, 返回包含编码内容的新字符串。 若 nocopynil 且编码操作无实际转换,函数可能直接返回 string。 编码结果为单字节字符串。

Command: decode-coding-region start end coding-system &optional destination

该命令根据编码系统 coding-systemstartend 的文本解码。 为使显式解码有效,解码前的文本应为字节序列, 多字节与单字节缓冲区均可接受(多字节模式下原始字节应以八位字符表示)。 通常解码后文本会替换缓冲区原内容, 可选参数 destination 可改变该行为。 若 destination 为缓冲区,解码文本插入指针之后(指针不移动); 若为 t,命令返回解码后的多字节字符串而不插入。

若解码文本被插入缓冲区,命令返回解码文本长度。 若目标缓冲区为单字节缓冲区(see 选择表示形式), 解码文本的内部表示(see 文本表示方式)会以单个字节形式插入。

该命令会为解码文本添加 charset 文本属性, 属性值标明解码原始文本所用字符集。

该命令会在需要时自动检测文本编码。 若 coding-systemundecided, 命令会根据文本中的字节序列检测编码, 同时检测文本使用的行尾格式类型(see eol type)。 若 coding-systemundecided-eol-typeeol-typeunixdosmac), 则仅检测文本编码。 任何未指定行尾类型的编码系统(如 utf-8)都会让命令自动检测行尾格式; 若已知文本行尾格式,应完整指定编码(如 utf-8-unix)以避免自动检测。

Function: decode-coding-string string coding-system &optional nocopy buffer

该函数根据 coding-systemstring 中的文本解码, 返回包含解码内容的新字符串。 若 nocopynil 且解码操作无实际转换,函数可能直接返回 string。 为使显式解码有效,string 内容应为字节序列形式的单字节字符串, 多字节字符串亦可接受(假设其以多字节形式存储八位字节)。

该函数与 decode-coding-region 类似,会在需要时检测字符串编码。

若可选参数 buffer 指定缓冲区,解码文本会插入该缓冲区指针之后(指针不移动), 此时返回值为解码文本长度。 若目标缓冲区为单字节缓冲区,解码文本的内部表示会以单个字节形式插入。

该函数会为解码文本添加 charset 文本属性, 属性值标明解码原始文本所用字符集:

(decode-coding-string "Gr\374ss Gott" 'latin-1)
     ⇒ #("Grüss Gott" 0 9 (charset iso-8859-1))
Function: decode-coding-inserted-region from to filename &optional visit beg end replace

该函数对 fromto 的文本进行解码, 效果等同于使用 insert-file-contents 并传入其余参数从文件 filename 读取。

该函数的典型使用场景是:未解码读取文件后, 又希望对内容执行解码。 无需删除文本并重新读取,直接调用该函数即可。