Python 加载字符串时,汉字吃其他字符

Python 加载字符串时,汉字吃其他字符,python,character-encoding,lua,escaping,double-quotes,Python,Character Encoding,Lua,Escaping,Double Quotes,当我用loadstring加载lua中的数据时,一些神奇的汉字会失败 RawData = '{a="a朶b"}' Data = loadstring("return " .. RawData)() 那是因为: "朶" 's ascii字符(gbk编码)为0x96 0x5c 0x5c是“\”,之后将转义所有内容 所以,{a=“a朶b“}”变成{a=“a\150\b”}”,\b是错误的答案 然后,我将永远无法获得正确的输出“a”朶“b”,“b”被“吃”朶“ python中也会出现同样的引用问题

当我用loadstring加载lua中的数据时,一些神奇的汉字会失败

RawData = '{a="a朶b"}'
Data = loadstring("return " .. RawData)()
那是因为:

  • "朶" 's ascii字符(gbk编码)为0x96 0x5c
  • 0x5c是“\”,之后将转义所有内容
  • 所以,{a=“a朶b“}”变成{a=“a\150\b”}”,\b是错误的答案
然后,我将永远无法获得正确的输出“a”朶“b”,“b”被“吃”朶“

python中也会出现同样的引用问题:

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

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

exec("""print '''a朶b''' """)
  • 在文件中明确定义编码——编码:gbk--
  • 使用utf-8进行字符串/文件编码
但是lua只支持标准C,有没有引用或转义的想法


顺便说一下,这是有效的:

RawData = [=[ {a=[[a朶b]]} ]=]
return  loadstring("return " .. RawData)() .a
但是我必须改变原始数据,这是不可接受的

问题2:

exec("""print '''a朶b''' """)
如何保持lua中的字符串不被转义?(python做得很好)


在0x5c之前插入一个“\”怎么样?

嗯,您的原始数据编码不正确,我认为不值得添加一些“启发式”来猜测其中哪些是多字节或独立的。您应该更改其序列化程序(或通知其开发人员)在将字符串放入序列化之前,应将其转义符号视为字符串中的特殊符号。在这种特殊情况下,在将字符串添加到序列化之前,必须将所有
\
转换为
\\

如果您的数据源是用某种公共语言编写的,那么可能值得检查一下是否有现成的Lua序列化库可用。

如上所述,Lua可以以字符串文字处理UTF-8。如果您可以以UTF-8保存文件,则Lua将不会有任何问题。如果以后需要使用GBK编码(如将其保存在文件中或以编码方式为网页提供服务),您可以使用该库将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转换回来

朶 是一个2字节字符,不能在这两个字节之间插入任何内容。即使可以,我也不应该修改原始原始数据。我的意思是用“\\”替换“\”。任何触摸“\”的操作都会打断该2字节字符。如果其他原始数据包含“\b”怎么办“?您将怎么做?因为Lua根本不做任何字符编码/解码,所以您需要这样做(同时还要转义其他棘手的字节,如
)当您打印出字符串时,转义符将被删除,您将得到原始的2字节字符。遗憾的是,这破坏了在原始源代码中查看字符的能力。我添加了一个新问题:在lua中,如何保持字符串不转义?这似乎是最好的解决方案。但需要一个外部库,并对每一位进行转换。