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

for*_*rin 7 unicode lua utf-8

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

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

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

或者这种方式过于复杂,需要庞大的图书馆等等?

pra*_*pin 17

您可以使用以下代码轻松地从UTF-8编码的字符串中提取第一个字母:

function firstLetter(str)
  return str:match("[%z\1-\127\194-\244][\128-\191]*")
end
Run Code Online (Sandbox Code Playgroud)

因为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
Run Code Online (Sandbox Code Playgroud)

请注意,两个示例都返回每个字母的字符串值,而不是Unicode代码点数值.


Yu *_*Hao 6

Lua 5.3提供UTF-8库

\n\n

您可以使用utf8.codes来获取每个代码点,然后使用utf8.char获取字符:

\n\n
local str = "\xc3\x86\xc3\x98\xc3\x85"\nfor _, c in utf8.codes(str) do\n  print(utf8.char(c))\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

这也有效:

\n\n
local str = "\xc3\x86\xc3\x98\xc3\x85"\nfor w in str:gmatch(utf8.charpattern ) do\n  print(w)\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

utf8.charpattern字符串在哪里"[\\0-\\x7F\\xC2-\\xF4][\\x80-\\xBF]*"匹配一个 UTF-8 字节序列的模式的字符串。

\n