像“Annähren”、“Überbringen”、“Malmö”这样的词不会被
for w in string.gmatch(str, "%w+") do
print(w)
end
有什么解决办法吗?谢谢!
像“Annähren”、“Überbringen”、“Malmö”这样的词不会被
for w in string.gmatch(str, "%w+") do
print(w)
end
有什么解决办法吗?谢谢!
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,然后使用该库或其他类似的库。
您可以尝试以下方法:
local str = "Annähren, Überbringen, Malmö"
for w in string.gmatch(str, "[%w\128-\244]+") do
print(w)
end
这并不完全正确,因为它忽略了一些 UTF-8 组合,但它可能对您有用。这个 SO 答案和这篇关于验证 UTF-8 的帖子可能很有用。