【问题标题】:Extract the first letter of a UTF-8 string with Lua使用 Lua 提取 UTF-8 字符串的第一个字母
【发布时间】:2012-10-25 11:09:32
【问题描述】:

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

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

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

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

【问题讨论】:

标签: unicode utf-8 lua


【解决方案1】:

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

【讨论】:

  • 太棒了!这正是我正在寻找的答案。简短而准确。
  • 这对于已经过验证的数据是合理的,但您可能要小心尚未经过验证的数据。
【解决方案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 字节序列的模式。

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多