5

像“Annähren”、“Überbringen”、“Malmö”这样的词不会被

for w in string.gmatch(str, "%w+") do
     print(w) 
end

有什么解决办法吗?谢谢!

4

2 回答 2

3

Lua 字符串库本质上不支持除 ASCII 以外的任何字符编码,并假定所有字符都是 1 个字节。虽然 lua 字符串是 8 位干净的,但这意味着string.sub即使在多字节字符编码中,像这样的函数也期望以字节为单位的偏移量,并且像这样的函数string.match在非 ASCII 编码中的行为不会像预期的那样。Lua 中有关 Unicode 的 wiki 页面值得一读,其中大部分内容也适用于其他非 ASCII 字符编码。

特别是对于您的问题,“ö”(例如在 UTF-8 中)被编码为两个字节C3 B6,这意味着它不会被'%w'(它在 az 范围内查找字符,并且没有跨越多个字节的字符)。'[\xc3\xb6]+'会匹配它,但也会匹配很多其他的东西,并不是所有的东西都是有效的 UTF-8 - 并且 using'[ö]'有同样的问题,因为 lua 会将它解释为相同的东西(两个字节的序列而不是一个单个字符)。如果您不使用 UTF-8,具体情况会有所不同,但基本问题仍然相同。

wiki 页面链接了许多用于 lua 的 UTF-8 感知字符串库实现,例如slnunicode。其他编码似乎并未被社区广泛使用,因此如果您使用的是 UTF-8 以外的编码,最好的选择可能是转换为 UTF-8,然后使用该库或其他类似的库。

于 2013-09-11T14:36:51.253 回答
1

您可以尝试以下方法:

local str = "Annähren, Überbringen, Malmö"
for w in string.gmatch(str, "[%w\128-\244]+") do
  print(w) 
end

这并不完全正确,因为它忽略了一些 UTF-8 组合,但它可能对您有用。这个 SO 答案和这篇关于验证 UTF-8 的帖子可能很有用。

于 2013-09-11T01:04:23.937 回答