当我通过loadstring 在lua中加载数据时,一些神奇的中文字符会失败。
RawData = '{a="a朶b"}'
Data = loadstring("return " .. RawData)()
那是因为:
然后,我永远不会得到正确的输出“a朵b”,“b”被“朵”吃掉....
在python中发生相同的引用问题:
exec("""print '''a朶b''' """)
有一些方法可以在python中处理这个问题:
但是lua只支持标准C,任何引用或逃避想法?
RawData = [=[ {a=[[a朶b]]} ]=]
return loadstring("return " .. RawData)() .a
但我必须更改原始RawData,这是不可接受的。
问题2:
如何保持lua中的字符串不被转义? (python做得很好)
s = "a朶b"
s1 = string.format("%q", s) -- s escaped
return s -- s escaped
print(s) -- s escaped
答案 0 :(得分:2)
正如Lua mailing list所讨论的那样,Lua在字符串文字中处理UTF-8就好了。如果你可以用UTF-8保存文件,你就不会有Lua的问题。如果您以后需要使用GBK编码(例如将其保存在文件中或在编码中提供网页),您可以使用lua-iconv库将UTF-8文字转换为GBK:
local iconv = require "iconv"
local toGbk = iconv.new("GBK", "UTF-8")
function U2G(s) return toGbk:iconv(s) end
-- assuming the while file is saved in UTF-8, this will output the string in GBK
print(U2G "a朶b")
您可以做的另一件事是在使用loadstring
之前将GBK转换为UTF-8。然后在向用户展示结果时不要忘记从UTF-8转换回来。
答案 1 :(得分:0)
在0x5c之前插入'\'怎么样?
答案 2 :(得分:0)
好吧,你的RawData只是编码不正确,我觉得不值得添加一些“启发式”,可以猜出哪些是多字节或独立的一部分。您应该更改其序列化程序(或通知他们的开发人员)他们应该转义符号Lua在将它们放入序列化之前在其字符串中视为特殊符号。在此特定情况下,在将字符串添加到序列化之前,必须将所有\
转换为\\
。
如果您的数据源是用某种通用语言编写的,那么可以查看是否有可用的Lua序列化库。