- 0X22 更多格式
- Lua的字符串字面值中可以出现UTF8字符.但是string模块的函数主要是用来处理ASCII字符串的.在处理在处理这种字符串的时候.多字节的字符会被当成多个ASCII字符.例如
string.len('你好')
的返回值是6.因为UTF8中一个汉字编码占三个字节. - Lua的标准库中提供了对UTF8的基本支持.这部分将介绍这些内容.
- Lua提供的处理UTF8的函数都在一个叫utf8的模块.
- 如果本文中的例程不能使用.请检查之前是否运行了
require('utf8')
- UTF8的内容不是并不是必须掌握的内容.
- utf8.len是string.len的UTF8版本,返回UTF8字符串的字符长度.
utf8.len('你好')
将会返回2.- 这个函数有两个可选的参数,用于指定字符串中的一个区间.计算这个区间中的字符个数.例如
utf8.len('你好',1,6)
- 指定区间时,单位不是UTF8字符,而是字节数.上边的例子中第一个参数是字符串,第二个参数是区间开始,第三个参数是区间结尾.
- 计数时所选区间为闭区间.
- 指定区间时,可以用负数.负数表示倒数,例如
utf8.len('你好',-3,-1)
表示从倒数第三个到倒数第一个字节的区间. - 可以仅仅指定区间开始位置,这样区间结束位置默认为-1.
- 如果指定的字节区间内存在无效的编码字节,则这个函数会有两个返回值:
a,b=utf8.len('你好',2)
'你好'
中的位置.
- 这个函数有两个可选的参数,用于指定字符串中的一个区间.计算这个区间中的字符个数.例如
- utf8.char接受任意个整数参数.把这些整数转化成对应的字符,并返回由它们组成的字符串.例如
utf8.(20320,22909)
'你好'
.其中的两个整数,分别是这两个字的十进制Unicode码. - utf8.codepoint是char的逆运算.它接受字符串,返回Unicode 码.
- 它和utf8.len一样可以指定闭区间,返回区间内的字符的编码.如果不指定区间,默认返回第一个字符串字符的Unicode值.
- 如果指定了区间,它可能会一次性返回多个值,这时候就要用多个变量去接受.
- 如果想把返回的多个值组合成一张表,就用创建表的语法:
codeList={utf8.codepoint('你好啊',1,-1)}
- utf8.codes也是utf8.char的逆变换.它不会返回一个列表,之类的东西,而是会返回一个迭代器.关于迭代器的内容将会在其他章节介绍.这里给出一个输出迭代器中全部内容的例句.
for i,v in utf8.codes('你好') do print(i,v) end
- utf8.offset至少接受两个参数str和n.其中str是一个字符串,n是一个整数.它返回字符串str中第n个UTF8字节串的起始字节位置.例如:
utf8.offset('你好啊',2)
- 这个函数还可以接受第三个参数i用于指定计数的起点.
utf8.offset('你好啊',2,4)
表示从第四个字节开始数的第二个UTF8字节串的起始位置.应该返回7.第三个参数i的默认值为1. - 如果n为0则返回,i的位置.如果n为负数则返回倒数第n个UTF8字节串的起始字节位置.
- 如果找不到指定位置字符,这个函数会返回nil.
- 这个函数还可以接受第三个参数i用于指定计数的起点.
- utf8模块中的函数,接受的参数中如果含有无效的UTF8编码或者指定的闭区间中含有无效的UTF8编码,都有可能报错.
- utf8.charpattern不是一个函数,而是一个模块中预定义的字符串.与之等价的字面值为
"[\0-\x7F\xC2-\xF4][\x80-\xBF]*"
.在subject(主字符串)是一个有效的UTF8字符串时,这个字符串作为模式匹配中的pattern(模板字符串),将会匹配到一个UTF8字节序列.- 如果一个字符是ASCII中包括的字符.它的UTF8字节序列只有一个字节,其内容等于其ASCII码值.
- 否则这个字符的UTF8字节序列可能占两个或者更多个字节.而这些字节合起来才能表示一个UTF8字符.
- 关于模式匹配的内容参见其他章节.
- 在字符串中直接加入UTF8字符的字面值可以使用如下写法:
print('\u{123}\u{444}\u{4f}')
其中花括号中的数字是十六进制的字符UTF8码. 10. 关于UTF8的更多内容请自行百度或者Google.
- 0X30 模块调用