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

时间:2012-11-05 15:22:09

标签: unicode utf-8 lua

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

Lua不正确支持Unicode,因此string.sub("ÆØÅ", 2, 2)将返回"?"而不是"Ø"

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

或者这太复杂了,需要一个庞大的图书馆等?

2 个答案:

答案 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字节序列的模式。