有没有办法用 Lua 提取 UTF-8 编码字符串的第一个字母?
Lua 没有正确支持 Unicode,所以string.sub("ÆØÅ", 2, 2)
会返回"?"
而不是"Ø"
.
是否有一个相对简单的 UTF-8 解析算法我可以在每个字节的字符串上使用,其唯一目的是获取字符串的第一个字母,无论是汉字还是 A?
还是这种方式太复杂了,需要一个庞大的库等?
您可以使用以下代码轻松地从 UTF-8 编码字符串中提取第一个字母:
function firstLetter(str)
return str:match("[%z\1-\127\194-\244][\128-\191]*")
end
因为 UTF-8 代码点要么以 0 到 127 的字节开头,要么以 194 到 244 的字节后跟 128 到 191 的一个或多个字节。
您甚至可以以类似的方式迭代UTF-8 代码点:
for code in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
print(code)
end
请注意,这两个示例都为每个字母返回一个字符串值,而不是 Unicode 代码点数值。
Lua 5.3 提供了一个UTF-8 库。
您可以使用utf8.codes
来获取每个代码点,然后使用utf8.char
来获取字符:
local str = "ÆØÅ"
for _, c in utf8.codes(str) do
print(utf8.char(c))
end
这也有效:
local str = "ÆØÅ"
for w in str:gmatch(utf8.charpattern ) do
print(w)
end
whereutf8.charpattern
只是"[\0-\x7F\xC2-\xF4][\x80-\xBF]*"
模式匹配一个 UTF-8 字节序列的字符串。