Lua, XML, UTF-8

我正在使用 luaxml 库从 lua 表中筛选数据库生成 xml 文件。一切都很好,但是我在我的数据库(NySQL)中使用了俄文字母。我需要用 luaxml 来表示这些符号,而不是用代码(比如 Ð)来代替实际符号。

我找到了函数 xml.registerCode(decoded,encoded),但是我不理解它的用法。

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

原文链接 https://stackoverflow.com/questions/4553117

点赞
stackoverflow用户936986
stackoverflow用户936986

我已经查看了 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-23 12:59:37
stackoverflow用户474669
stackoverflow用户474669

在查看 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-01 15:45:58