中文字符在lua loadstring中吃其他字符

时间:2012-07-11 07:20:17

标签: python character-encoding lua escaping double-quotes

当我通过loadstring 在lua中加载数据时,一些神奇的中文字符会失败。

RawData = '{a="a朶b"}'
Data = loadstring("return " .. RawData)()

那是因为:

  • “朵”的ascii char(gbk编码)是0x96 0x5c
  • 0x5c是'\',之后会逃避一切。
  • 所以,'{a =“a朵b”}'变为'{a =“a \ 150 \ b”}',\ b是错误的回答

然后,我永远不会得到正确的输出“a朵b”,“b”被“朵”吃掉....

在python中发生相同的引用问题:

exec("""print '''a朶b''' """)

有一些方法可以在python中处理这个问题:

  • 清楚地定义文件中的编码 - - 编码:gbk - -
  • 使用utf-8进行字符串/文件编码

但是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

3 个答案:

答案 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序列化库。