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

Unicode 用Lua提取UTF-8字符串的第一个字母,unicode,utf-8,lua,Unicode,Utf 8,Lua,有没有办法用Lua提取UTF-8编码字符串的第一个字母 Lua不支持Unicode,因此string.sub(“ÆØ”,2,2)将返回“?”,而不是“Ø” 是否有一个相对简单的UTF-8解析算法可以用于每个字节的字符串字节,其唯一目的是获取字符串的第一个字母,无论是汉字还是a 或者这种方法过于复杂,需要庞大的库等?您可以使用以下代码轻松地从UTF-8编码字符串中提取第一个字母: function firstLetter(str) return str:match("[%z\1-\127\19

有没有办法用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代码点数值。

Lua5.3提供了一个字符串值

您可以使用
utf8.code
获取每个代码点,然后使用
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字节序列。

“简单Unicode解析算法”这是什么类型的“Unicode”?是UTF-8、UTF-16还是别的什么?编码是什么?读这个。求你了,这也是一个精彩的节目!这正是我想要的答案。简短而精确。这对于已经验证过的数据来说是合理的,但您可能需要小心处理尚未验证过的数据。