匹配UTF-8编码字符的模式

时间:2015-05-27 18:15:36

标签: utf-8 lua luajit

给定一个有效的UTF-8字节序列,我想迭代每个编码字符。在我的工作环境(LuaTeX)中,只有Lua 5.2和LuaJIT 2.0.3可用,所以我不能使用Lua 5.3附带的UTF-8库提供的任何功能。

所述库包括用于所述目的的模式utf8.charpattern,其中“恰好匹配一个UTF-8字节序列”。我想我可以简单地复制它并将其传递给string.gmatch

-- Taken from http://www.lua.org/manual/5.3/manual.html#pdf-utf8.charpattern
local utf8charpattern = "[\0-\x7F\xC2-\xF4][\x80-\xBF]*"

-- Correctly shows `14´ in both cases (see below)
print( string.len(utf8charpattern) )

local function print_characters( s )
    local i = 1

    for c in s:gmatch( utf8charpattern ) do
        io.stdout:write( "#" , i , "\t" , c , "\n" )

        i = i + 1
    end
end

print_characters( "cántico" )

在Lua 5.2(标准luatex)下,这种方法运行正常。但是,如果我切换到LuaJIT变体(luajittex),它将失败并显示以下消息:

  

格式错误的模式(缺少']')

在对问题进行了一段时间的努力之后,我意识到问题出在模式开头的\0字节。在两种情况下,Lua实现都正确地知道字符串的大小(14个字节),但似乎LuaJIT下的模式匹配函数(我也试过string.match)在找到臭名昭着的0后停止读取模式字节。

问题

  • 这种行为是正确的,还是LuaJIT中的错误?
  • 无论是正确的行为还是错误,它如何解决? 我已经尝试用\0替换%z,但它似乎与使用的范围功能不太匹配。另外,只是摆弄它,我用\0取代\001,它似乎工作正常。虽然我对这个主题知之甚少,但我怀疑我的任何字符串都包含0字节,所以也许这是一个可接受的解决方案。也就是说,如果可以接受,请证明这一点。

0 个答案:

没有答案