使用Lua提取UTF-8字符串的第一个字母

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

Lua 不完全支持 Unicode,所以 string.sub("ÆØÅ", 2, 2) 将返回 "?" 而不是 "Ø"

有没有一个相对简单的 UTF-8 解析算法,我可以在字节层面使用它来获取字符串的第一个字母,无论是中文字符还是 A?

或者这太复杂了,需要一个巨大的库等等?

点赞
用户1008957
用户1008957

你可以使用以下代码轻松从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-05 18:39:04
用户1009479
用户1009479

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

其中 utf8.charpattern 只是用于匹配一个 UTF-8 字节序列的模式字符串 "[\0-\x7F\xC2-\xF4][\x80-\xBF]*"

2015-01-14 11:12:53