3

在从 lua 表中选择数据库后,我使用 luaxml lib 生成 xml 文件。一切都很好,但我在我的数据库(NySQL)中使用俄罗斯符号。我需要用 luaxml 做什么来表示这个符号不是用代码(a-la С)而是用一个真实的符号。我找到了方法函数 xml.registerCode(decoded,encoded) 但什么都不懂:(

或者,也许,我需要使用另一个库。如果是这样 - 什么库?

4

2 回答 2

0

我查看了 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>
于 2014-09-23T12:59:37.720 回答
0

查看 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。

于 2018-05-01T15:45:58.070 回答