在从 lua 表中选择数据库后,我使用 luaxml lib 生成 xml 文件。一切都很好,但我在我的数据库(NySQL)中使用俄罗斯符号。我需要用 luaxml 做什么来表示这个符号不是用代码(a-la С)而是用一个真实的符号。我找到了方法函数 xml.registerCode(decoded,encoded) 但什么都不懂:(
或者,也许,我需要使用另一个库。如果是这样 - 什么库?
我查看了 lib 内部 - 它对所有 >127 个字节进行强制编码,从而将 UTF 分解为单独的字符。它是在使用其内置.registerCode
机制之后执行的,因此您甚至无法覆盖它。
如果您需要编码一些复杂的数据结构,您可以在XmlLua
完成字符串化后通过在某处声明来展开所有这些实体替换:
local high_ascii_unroll = {}
for code = 128, 255 do
high_ascii_unroll['&#' .. code .. ';'] = string.char(code)
end
然后gsub
在最终字符串上使用:
local doc = xml.new("outer")
doc.version = "2.0"
local inner = xml.new("inner")
inner.id = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫьЭЮЯ"
table.insert(doc, inner)
local encoded = xml.str(doc):gsub('&#%d+;', high_ascii_unroll)
-- <outer version="2.0">
-- <inner id="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫьЭЮЯ" />
-- </outer>
查看 LuaXML_lib.c 内部,有一个名为 char2code() 的方法,它用数字实体替换不在 ASCII 范围内的字符。您可以通过将方法替换为以下内容来“破解”它:
static const char* char2code(unsigned char ch, char buf[2]) {
buf[0]=ch;
buf[1]=0;
return buf;
}
这会阻止它用实体替换任何无效字符。然后由您来确保您的输入中没有无效字符,但它绝对不会再破坏您的 UTF-8。