如何编写支持umlauts的Lua模式

有像“Annähren”、“Überbringen”、“Malmö”这样的词并不能被下面的代码所捕捉:

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

有什么解决方案吗?谢谢!

点赞
用户1442917
用户1442917

你可以尝试以下代码来处理 UTF-8 字符:

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

虽然这种方式并不十分精确,因为它会忽略一些 UTF-8 字符,但是它可能会对你有用。如果你需要更严格的处理方式,可以参考 这个 Stack Overflow 回答 或者这篇博客 关于验证 UTF-8

2013-09-11 01:04:23
用户2755919
用户2755919

Lua的字符串库天生不支持除了ASCII之外的任何字符编码,而且假定所有字符都是1字节。虽然Lua字符串是8比特清洁的,但这意味着像string.sub这样的函数即使在多字节字符编码中也会期望字节偏移量,而像string.match这样的函数在非ASCII编码中使用时的行为与预期不符。值得阅读Lua中的Unicode维基页面,其中许多内容也适用于其他非ASCII字符编码。

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

维基页面链接了许多针对UTF-8感知的Lua字符串库实现,例如slnunicode。社区中似乎没有广泛使用其他编码,因此,如果您使用的是除UTF-8之外的编码,则最好将其转换为UTF-8,然后使用该库或类似库。

2013-09-11 14:36:51