Lua、XML、UTF-8
我使用luaxmllib在数据库从lua表中选择后生成xml文件。一切都很好,但我在DB(NySQL)中使用了俄语符号。我需要用luaxml做的不是用代码(a-laÐ)而是用真实的符号来表示这些符号。 我找到了方法函数xml.registerCode(解码、编码),但什么都不懂:(Lua、XML、UTF-8,xml,lua,luaxml,Xml,Lua,Luaxml,我使用luaxmllib在数据库从lua表中选择后生成xml文件。一切都很好,但我在DB(NySQL)中使用了俄语符号。我需要用luaxml做的不是用代码(a-laÐ)而是用真实的符号来表示这些符号。 我找到了方法函数xml.registerCode(解码、编码),但什么都不懂:( 或者,也许,我需要使用另一个库。如果是的话-什么库?我已经查看了库的内部-它对所有>127字节进行强制编码,从而将UTF分解为单独的字符。它在使用其内置的.registerCode机制后执行此操作,因此您甚至无法覆盖
或者,也许,我需要使用另一个库。如果是的话-什么库?我已经查看了库的内部-它对所有>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>
localdoc=xml.new(“外部”)
doc.version=“2.0”
本地内部=xml.new(“内部”)
internal.id=“АБГБББББББББББББББСгЙЙМПППСПСПППСПФЧЩЪЮЯ”
表.插入(文件,内部)
localencoded=xml.str(doc):gsub('%d+'),high_ascii_unroll)
--
--
--
查看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。请提供更多详细信息。至少包括您正在调用的函数、它们的参数、预期结果和您获得的结果你所说的“真实符号”是什么意思?你的数据库使用的是什么编码,你在xml头中放的是什么编码?你在将字符串写入xml之前修改过字符串吗?