【问题标题】:Lua gmatch odd characters (Slovak alphabet)Lua gmatch 奇数字符(斯洛伐克字母表)
【发布时间】:2014-05-22 03:43:00
【问题描述】:

我正在尝试从斯洛伐克语单词的字符串中提取字符。例如,“TURTLE”的单词是“KORYTNAČKA”。但是,当我尝试从字符串中提取它时,它会跳过“Č”字符:

local str = "KORYTNAČKA"
for c in str:gmatch("%a") do print(c) end
--result: K,O,R,Y,T,N,A,K,A

我正在阅读this page,我也尝试将字符串本身作为一个集合粘贴,但它出现了一些奇怪的东西:

local str = "KORYTNAČKA"
for c in str:gmatch("["..str.."]") do print(c) end
--result: K,O,R,Y,T,N,A,Ä,Œ,K,A

有人知道怎么解决吗?

【问题讨论】:

  • 使用 1 字节斯洛伐克语代码页而不是 UTF-8 编码的文本

标签: string unicode lua coronasdk lua-patterns


【解决方案1】:

Lua 是 8 位干净的,这意味着 Lua 字符串假定每个字符都是一个字节。模式"%a" 匹配一个字节的字符,所以结果不是你所期望的。

"["..str.."]" 模式之所以有效,是因为一个 Unicode 字符可能包含多个字节,在此模式中,它在一个集合中使用这些字节,以便匹配字符。


如果使用 UTF-8,则可以使用模式 "[\0-\x7F\xC2-\xF4][\x80-\xBF]*" 匹配 Lua 5.2 中的单个 UTF-8 字节序列,如下所示:

local str = "KORYTNAČKA"
for c in str:gmatch("[\0-\x7F\xC2-\xF4][\x80-\xBF]*") do 
    print(c) 
end

在 Lua 5.1(这是 Corona SDK 使用的版本)中,使用这个:

local str = "KORYTNAČKA"
for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do 
    print(c) 
end

有关此模式的详细信息,请参阅Equivalent pattern to “[\0-\x7F\xC2-\xF4][\x80-\xBF]*” in Lua 5.1

【讨论】:

  • 在此添加注释:即将推出的 Lua 5.3 将添加基本的 utf8 库。
  • 当我尝试这个时,它给了我错误:“格式错误(缺少']')”。我正在使用 Corona SDK 在 Lua 中编程。
  • @ArdentKid 你明白了,我认为这是因为 Corona SDK 使用的是 Lua 5.1,但我还没有让它工作。我向a question 询问了这个问题,一旦有人回答我的问题,我就会更新这个答案。
  • 看起来他找到了解决方案,但它并没有真正做到我想要的(解析单个字符)并且不包括奇数字符。
  • @ArdentKid 查看更新,"[%z\1-\127\194-\244][\128-\191]*" 应该可以在 Lua 5.1 中使用
【解决方案2】:

Lua 没有对 Unicode 字符串的内置处理。您可以看到Ä,Œ 是一个2 个字节,表示Č 字符的UTF-8 编码。

于浩已经提供了示例解决方案,更多详情请点击good source

我已经测试并发现 this solution 在 Lua 5.1 中正常工作,reserve link。您可以使用utf8sub 函数提取单个字符,请参阅sample

【讨论】:

    【解决方案3】:
    string.gmatch(str, "[%z\1-\127\192-\253][\128-\191]*")
    

    【讨论】:

      【解决方案4】:

      使用utf8 插件。然后将string.gmatch替换为utf8.gmatch

      示例(在 Win7 上测试,对我有用)

      yourfilename.lua
      
      local utf8 = require( "plugin.utf8" )
      
      for c in utf8.gmatch( "KORYTNAČKA", "%a" ) do print(c) end
      

      build.settings
      
      settings =
      {
          plugins =
          {
              ["plugin.utf8"] =
              {
                  publisherId = "com.coronalabs"
              },
          },      
      }
      

      阅读更多:

      祝你有美好的一天:)

      【讨论】:

        猜你喜欢
        • 2015-12-21
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        相关资源
        最近更新 更多