【问题标题】:how to write a lua pattern for words with umlauts如何为带有变音符号的单词编写 lua 模式
【发布时间】:2013-09-11 22:36:51
【问题描述】:

诸如“Annähren”、“Überbringen”、“Malmö”之类的词不会被理解

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

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

【问题讨论】:

  • 你能试试“%S+”吗?我记得在某处读到 %S 代表每个不是空格的字符。所以:for w in string.gmatch(str, "%S+")
  • 这接近我的(希望是)最终解决方案:for w in string.gmatch(myStr, "[^,;]+") do print(w) end 这可以满足我的需求。

标签: design-patterns lua


【解决方案1】:

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

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

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

【讨论】:

  • 在实践中,您基本上是正确的。 Lua 规范(和源代码)不需要任何特定的字符集和编码。 Lua 的string 库中的一些函数的行为取决于为其构建的 C 运行时库(或等效库)。 Lua 构建者应该为他们的用户提供关于字符集、数字特征等的技术数据。string 数据类型是一个计数的字节序列,而不是一个字符序列。
【解决方案2】:

您可以尝试以下方法:

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

【讨论】:

  • 我不确定 OP 是否使用 UTF-8。它可能是一些扩展的 ASCII 编码,因此可能需要将范围扩展到 \255(或者添加特定的字符代码,如果 OP 可以找出它们是什么)。
  • 可能是;我也不确定。这就是为什么我说“可以试试”;)
  • 是的!这就是为什么我想添加这个提示。 :-)
  • 如果一个人有一个文本文件或字符串(包括 Lua 源)并且不知道字符集和编码,那么一个人经历了 数据丢失。 如果一个人知道数据的字符集和编码,但不知道要使用的功能是否与之兼容,那么一个是programming by coincidence
猜你喜欢
  • 2021-03-27
  • 2010-11-28
  • 1970-01-01
  • 2021-10-07
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2019-12-08
相关资源
最近更新 更多