如何用变音符号为单词写一个lua模式

时间:2013-09-10 21:54:14

标签: design-patterns lua

像“Annähren”,“Überbringen”,“Malmö”这样的词语没有被

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

任何解决方案?谢谢!

2 个答案:

答案 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可能很有用。