像“Annähren”,“Überbringen”,“Malmö”这样的词语没有被
抓住for w in string.gmatch(str, "%w+") do
print(w)
end
任何解决方案?谢谢!
答案 0 :(得分:2)
Lua字符串库本身不支持ASCII以外的任何字符编码,并假设所有字符都是1个字节。虽然lua字符串是8位干净的,但这意味着像string.sub
这样的函数即使在多字节字符编码中也会出现字节偏移,而像string.match
这样的函数在非ASCII编码时不会像预期的那样运行。值得阅读wiki page on Unicode in Lua,其中大部分也适用于其他非ASCII字符编码。
特别针对您的问题,'ö'(例如,UTF-8)编码为两个字节C3 B6
,这意味着'%w'
无法识别它(查找az范围内的字符,并且没有跨越多个字节的字符概念)。 '[\xc3\xb6]+'
会匹配它,但也会匹配很多其他内容,而不是所有内容都是有效的UTF-8 - 并且使用'[ö]'
会遇到同样的问题,因为lua会将其解释为相同thing(两个字节的序列而不是单个字符)。如果您没有使用UTF-8,具体情况会有所不同,但基本问题仍然存在。
wiki页面为lua链接了许多支持UTF-8的字符串库实现,例如slnunicode。其他编码似乎没有被社区广泛使用,因此如果您使用UTF-8以外的编码,您最好的选择可能是转换为UTF-8然后使用该库或其他类似的。
答案 1 :(得分:0)
您可以尝试以下方法:
local str = "Annähren, Überbringen, Malmö"
for w in string.gmatch(str, "[%w\128-\244]+") do
print(w)
end
它不是严格正确的,因为它忽略了一些UTF-8组合,但它可能对你有用。 This SO answer和此post on validating UTF-8可能很有用。