8

有没有办法用 Lua 提取 UTF-8 编码字符串的第一个字母?

Lua 没有正确支持 Unicode,所以string.sub("ÆØÅ", 2, 2)会返回"?"而不是"Ø".

是否有一个相对简单的 UTF-8 解析算法我可以在每个字节的字符串上使用,其唯一目的是获取字符串的第一个字母,无论是汉字还是 A?

还是这种方式太复杂了,需要一个庞大的库等?

4

2 回答 2

18

您可以使用以下代码轻松地从 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 代码点数值。

于 2012-11-05T18:39:04.840 回答
3

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 字节序列的字符串。

于 2015-01-14T11:12:53.190 回答