在Lua中分割多字节字符串

3

我有一个在Lua中的多字节字符串。

local s = "あいうえお"

如何将字符串拆分为字符串表?

对于英文文本,可以使用以下代码。但是这在多字节情况下无法工作。

local s = "foo bar 123"
local words = {}
for word in s:gmatch("%w+") do
    table.insert( words, word )
end

日语中的“单词”边界在哪里?或者你只需要将该字符串拆分成单个字符的表格,就像这样?{"あ", "い", "う", "え", "お"} - Sergey Kalinichenko
使用ICU4Lua - daurnimator
ICU也是一个非常庞大的重量级库,对于Lua中简单的UTF-8处理来说完全不必要(对于许多任务使用ICU可能会更慢,因为你需要付出将字符串转换为/从其内部格式而不是直接操作它们的代价)。 - snogglethorpe
3个回答

7

正如其他人所指出的,很难确定你想要做什么:如果在空格处分割不够,请问您要在哪里分割非ASCII字符?

如果您只想为非ASCII字符之间的单个字符进行拆分,则可以尝试以下类似方法:

s = "oink barf 頑張っています"
for word in s:gmatch("[\33-\127\192-\255]+[\128-\191]*") do
   print (word)
end

生成:

oink
barf
頑
張
っ
て
い
ま
す

这里的技巧在于,在UTF-8中,多字节字符由“前导字节”组成,其最高两位为11(因此在Lua中是\192\255,请记住,在Lua中的字符转义使用十进制),后跟零个或多个“尾随字节”,其最高两位等于10(在Lua中是\128\191)。

4

广泛的Unicode库是一种可能的解决方案,但通常非常笨重。不太清楚问题作者想要在这里拆分什么,所以很难确定最佳方法是什么,但对于许多简单的utf-8任务,直接编写操作编码的方法是相当合理的。 - snogglethorpe

2

如果是UTF-8编码,在Lua 5.3中,您可以像这样使用utf8

local s = "あいうえお"
local words = {}
for _, c in utf8.codes(s) do
  table.insert(words, utf8.char(c))
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接