所有在 Emacs 内外传输文本的操作,均可使用编码系统对文本进行编码或解码。 你也可以使用本节函数显式编码和解码文本。
编码结果与解码输入并非普通文本, 逻辑上由一系列字节值组成,即一系列 ASCII 与八位字符。 在单字节缓冲区与字符串中,这些字符编码范围为 0 至 #xFF(255)。 在多字节缓冲区或字符串中,八位字符的编码高于 #xFF(see 文本表示方式),但 Emacs 在编码或解码此类文本时,会透明地将其转换为单字节值。
若要将文件以字节序列读入缓冲区以便显式解码,
通常使用 insert-file-contents-literally(see 从文件读取);
或者在使用 find-file-noselect 打开文件时,指定非 nil 的 rawfile 参数。
这些方法会生成单字节缓冲区。
显式编码文本得到的字节序列,通常用于写入文件或发送至进程,
例如通过 write-region 写入(see 写入文件),
并将 coding-system-for-write 绑定为 no-conversion 以禁止自动编码。
以下为执行显式编码或解码的函数。
编码函数生成字节序列,解码函数用于处理字节序列。
所有这些函数都会丢弃文本属性,
并将 last-coding-system-used 设置为实际使用的精确编码系统。
该命令根据编码系统 coding-system 对 start 至 end 的文本进行编码。
通常编码后的文本会替换缓冲区中原内容,
但可选参数 destination 可改变这一行为。
若 destination 为缓冲区,编码文本会插入该缓冲区的指针之后(指针不移动);
若为 t,命令直接返回编码后的单字节字符串而不插入。
若编码文本被插入某缓冲区,命令返回编码文本长度。
编码结果逻辑上为字节序列, 但若原缓冲区为多字节,则编码后仍保持多字节模式, 所有八位字节会转换为多字节表示(see 文本表示方式)。
编码文本时**切勿**将 undecided 用作 coding-system,
否则可能产生意外结果。
若 coding-system 无明显合适值,
应使用 select-safe-coding-system(see select-safe-coding-system)推荐合适编码。
该函数根据 coding-system 对 string 中的文本编码,
返回包含编码内容的新字符串。
若 nocopy 非 nil 且编码操作无实际转换,函数可能直接返回 string。
编码结果为单字节字符串。
该命令根据编码系统 coding-system 对 start 至 end 的文本解码。
为使显式解码有效,解码前的文本应为字节序列,
多字节与单字节缓冲区均可接受(多字节模式下原始字节应以八位字符表示)。
通常解码后文本会替换缓冲区原内容,
可选参数 destination 可改变该行为。
若 destination 为缓冲区,解码文本插入指针之后(指针不移动);
若为 t,命令返回解码后的多字节字符串而不插入。
若解码文本被插入缓冲区,命令返回解码文本长度。 若目标缓冲区为单字节缓冲区(see 选择表示形式), 解码文本的内部表示(see 文本表示方式)会以单个字节形式插入。
该命令会为解码文本添加 charset 文本属性,
属性值标明解码原始文本所用字符集。
该命令会在需要时自动检测文本编码。
若 coding-system 为 undecided,
命令会根据文本中的字节序列检测编码,
同时检测文本使用的行尾格式类型(see eol type)。
若 coding-system 为 undecided-eol-type(eol-type 为 unix、dos 或 mac),
则仅检测文本编码。
任何未指定行尾类型的编码系统(如 utf-8)都会让命令自动检测行尾格式;
若已知文本行尾格式,应完整指定编码(如 utf-8-unix)以避免自动检测。
该函数根据 coding-system 对 string 中的文本解码,
返回包含解码内容的新字符串。
若 nocopy 非 nil 且解码操作无实际转换,函数可能直接返回 string。
为使显式解码有效,string 内容应为字节序列形式的单字节字符串,
多字节字符串亦可接受(假设其以多字节形式存储八位字节)。
该函数与 decode-coding-region 类似,会在需要时检测字符串编码。
若可选参数 buffer 指定缓冲区,解码文本会插入该缓冲区指针之后(指针不移动), 此时返回值为解码文本长度。 若目标缓冲区为单字节缓冲区,解码文本的内部表示会以单个字节形式插入。
该函数会为解码文本添加 charset 文本属性,
属性值标明解码原始文本所用字符集:
(decode-coding-string "Gr\374ss Gott" 'latin-1)
⇒ #("Grüss Gott" 0 9 (charset iso-8859-1))
该函数对 from 至 to 的文本进行解码,
效果等同于使用 insert-file-contents 并传入其余参数从文件 filename 读取。
该函数的典型使用场景是:未解码读取文件后, 又希望对内容执行解码。 无需删除文本并重新读取,直接调用该函数即可。