String Lua gmatch奇数字符(斯洛伐克字母)

String Lua gmatch奇数字符(斯洛伐克字母),string,unicode,lua,coronasdk,lua-patterns,String,Unicode,Lua,Coronasdk,Lua Patterns,我正在尝试从斯洛伐克语单词的字符串中提取字符。例如,“海龟”一词是“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 我正在阅读,我也尝试将字符串本身作为一组粘贴,但它产生了一些奇怪的东西: local str = "KORYTNAČKA" for c in str:gma

我正在尝试从斯洛伐克语单词的字符串中提取字符。例如,“海龟”一词是“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
我正在阅读,我也尝试将字符串本身作为一组粘贴,但它产生了一些奇怪的东西:

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

有人知道如何解决这个问题吗?

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

有关此模式的详细信息,请参阅。

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

于浩已经提供了示例解决方案,但更多细节请参见

我已经测试并发现在Lua5.1中工作正常。您可以使用
utf8sub
函数提取单个字符,请参阅。

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

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

阅读更多:

  • ,
  • 对于utf8插件
  • ,

祝您愉快:)

在此处添加注释:即将推出的Lua5.3将添加一个基本的
utf8
库。当我尝试此操作时,会出现错误:“格式错误(缺少“]”)。我在Lua中使用Corona SDK进行编程。@ArdentKid你找到我了,我想这是因为Corona SDK使用Lua 5.1,但我还没有让它工作。我问过这个问题,当有人回答我的问题时,我会更新这个答案。看起来他已经找到了解决方案,但这并不是我想要的(解析单个字符),也不包括奇数字符。@ArdentKid查看更新,
“[%z\1-\127\194-\244][\128-\191]*”
应在Lua 5.1中使用1字节斯洛伐克代码页编码的文本,而不是UTF-8
string.gmatch(str, "[%z\1-\127\192-\253][\128-\191]*")
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"
        },
    },      
}