给定一个有效的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后停止读取模式字节。
\0
替换%z
,但它似乎与使用的范围功能不太匹配。另外,只是摆弄它,我用\0
取代\001
,它似乎工作正常。虽然我对这个主题知之甚少,但我怀疑我的任何字符串都包含0字节,所以也许这是一个可接受的解决方案。也就是说,如果可以接受,请证明这一点。