有没有办法用Lua提取UTF-8编码字符串的第一个字母?
Lua不正确支持Unicode,因此string.sub("ÆØÅ", 2, 2)
将返回"?"
而不是"Ø"
。
我是否可以在每个字节的字符串字节上使用相对简单的UTF-8解析算法,其唯一目的是获取字符串的第一个字母,无论是中文字符还是A?
或者这太复杂了,需要一个庞大的图书馆等?
答案 0 :(得分:17)
您可以使用以下代码轻松从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
请注意,这两个示例都为每个字母返回 string 值,而不是Unicode代码点数值。
答案 1 :(得分:2)
Lua 5.3提供UTF-8 library。
您可以使用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
其中utf8.charpattern
只是字符串"[\0-\x7F\xC2-\xF4][\x80-\xBF]*"
,用于匹配一个UTF-8字节序列的模式。