Lua,XML,UTF-8

时间:2010-12-29 09:59:39

标签: xml lua luaxml

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

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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。