4.4 LUA语言中的UTF-8编码支持

ASCII码用一个字节来进行编码(最高位为0),由128个字符组成,包括英文字符(大小写)、阿拉伯数字(0~9)、标点符号(英文)、非打印字符、控制字符。ASCII码针对英文设计,其它语言的字符无法表示。

Unicode用2个字节来进行编码,其所定义的每种语言中的每个字符的编码都是统一且唯一的,能够跨编程语言、跨平台进行文本处理。但Unicode码也尚缺乏对部分语言字符的支持。

UTF-8(Unicode Transformation Format),其中的“8”表示编码长度最小单位是8bit(=1字节),可以使用1、2、3、4个字节进行编码,是针对Unicode的一种可变长度字符编码,它可以用来表示Unicode标准中的任何字符。其编码的第一个字节与ASCII相容,这样原来处理ASCII字符的软件基本无需或仅需少量修改即可继续使用。UTF-8使用一个字节来表示所有的ASCII码(0~127,对应十六进制为0x00~0x7F)。对于ASCII码之外的字符,UTF-8则使用字节序列来表示。其中第一个字节的范围是[194, 244]([0xC2, 0xF4]),后续字节的范围是[128, 191]([0x80, 0xBF])。具体来讲,2个字节时,第一个字节的范围是[194, 223]([0xC2, 0xDF]);3个字节时,第一个字节的范围是[224, 239]([0xE0, 0xEF]);4个字节时,第一个字节的范围是[240, 244]([0xF0, 0xF4])。这样的设计保证了任意字符字节序列不会成为其它字符字节序列的片段,这具有重要的意义。UTF-8逐渐在电子邮件、网页等场景中得到应用。

Lua语言中的String库中定义的标准函数一部分是适用于UTF-8字符串的,但String.reverse()、String.upper()、String.lower()、String.byte()、String.char()等函数是不适用于UTF-8字符串的,因为他们都是针对一字节字符的。Lua语言从5.3开始,引入了一个专门用于操作UTF-8编码的Unicode字符串标准库,使得相关应用更为方便。UTF-8的支持函数如下表所示。