我正在将我的应用程序从Python2移动到Python 3.应用程序将配置保存到文件中,其中一个属性在保存之前编码为utf-8。
例如:username ='ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ'保存为'\ xe1 \ x9a \ xa0 \ xe1 \ x9b .... x9a \ xb1'(转换后的数据类型为str)
由于这个配置文件将在迁移过程中保留,当我尝试检索用户名时,我无法将其解码为unicode,就像在python3中一样,str对象没有属性解码。理想情况下,文件中保存的值应视为字节,但由于python2不这样做,因此会产生问题。
我无法将其转换为字节对象,因为它会更改整个字符串,尝试相同。
无法更改当前应用程序代码,因为它已在生产中。
我尝试在字符串之前手动附加b',这就是诀窍。但这是一个黑客。尝试了ast.literal_eval,但又一次没有用。
伪代码目前在Python2上运行良好(在迁移到python3之前):
1. To save value in text file:
fp=open(filename,'w')
encoded_name=name.encode('utf-8')
fp.write(encoded_name)
fp.close()
2. To retrieve:
fp.open(filename, 'r') #or rb
encoded_name=fp.read()
fp.close()
return encoded_name.decode('utf-8)
预期结果:从配置文件中检索的用户名应被视为字节而不是str。
如果你使用
fp.open(filename, 'r')
然后你不需要decode
任何东西,它已经是一个unicode字符串。
但如果你使用
fp.open(filename, 'rb')
它应该用encoded_name.decode('utf-8')
解码