Skip to content

6.5 - UTF-8支持

本库对UTF-8编码提供了一些基础支持。所有提供的函数都放在表 utf8 中。本库对于其他的 Unicode 编码没有提供任何支持。所有需要使用字符含义的操作,例如字符分类,都不在讨论的范围之内。

除非另有说明,对于所有需要字节位置作参数的函数,都假设这个给出的位置要么是从字节序列的开头数起,要么始于字符串的长度加一数起。就像字符串库中一样。负数索引是从字符串末尾开始数的。

创建UTF-8字节序的函数可以接收 0x7FFFFFFF 以内的值,其定义于UTF-8原始规范;这意味着单个字节序最多为6个字节。

用于解释UTF-8字节序的函数只接受合法的字节序(格式正规并且不会过长)。默认情况下,其只接受结果值为Unicode码点中的字节序,拒绝大于 10FFF 的值和增补集。对于布尔参数 lax ,当它打开的时候,会解除检查,以接收 0x7FFFFFFF 之内的值。

utf8.char (···)

接受零个或多个整数值,将其转化为对应的UTF-8字节序,并返回包含了这些字节序的字符串。

utf8.charpattern

模式串(是个字符串,不是函数)"[\0-\x7F\xC2-\xFD][\x80-\xBF]*" ,其会匹配一个UTF-8字节序,它假定其是一个UTF-8编码的字符串。

utf8.codes (s [, lax])

用法如下:

lua
for p, c in utf8.codes(s) do body end

其会迭代字符串 s 中所有的的UTF-8编码字符,返回值 p 为该字符的位置(以字节为单位计数),c 为对应字符的码点值。当遇到无效的字节序时会抛出错误。

utf8.codepoint (s [, i [, j [, lax]]])

返回字符串 s 中从第 i 个字节直到第 j 个字节(包括 i 和 j)之间的所有字符的对应码点。参数 i 默认为1、参数 j 默认等于 i 。当遇到任何非法的字节序时会抛出错误。

utf8.len (s [, i [, j [, lax]]])

返回字符串 s 中从第 i 个字节直到第 j 个字节(包括 i 和 j)之间所包含的UTF-8字符的数量。参数 i 默认为1、参数 j 默认等于-1。当遇到任何非法的字节序时会返回fail加上遇到的第一个非法字节的位置。

utf8.offset (s, n [, i])

返回在字符串 s 中第 n 个字符编码的起始位置(字节位置,从第 i 个字节开始算)。当 n 为负数时则从位置 i 开始往前数。当参数 n 非负且不超过 s 的长度时,参数 i 默认为1,因此 utf8.offset(s, -n) 会获取字符串末尾开始倒数第 n 个字符的字节位置。如果指定的字符不在字符串中或者超出了末尾的范围,那么会返回fail

有个特殊的例子是,当 n 为0时,该函数会返回包含了在字符串 s 中第 i 个字节的字符的编码起始位置。

该函数的前提是 s 为一个合法的UTF-8编码的字符串。