# _*_ coding:utf-8 _*_
import cPickle as p
class Human(object):
def __init__(self, address):
self.address = address
def txl(self):
address_file = 'address.txt'
af = {'address':self.address}
f = open(address_file, 'a')
p.dump(af, f)
f.close()
address = '上海'
dq = Human( address)
dq.txl()
问题:生成的文件address.txt里无法显示汉字‘上海’,而是'\xe4\xb8\x8a\xe6\xb5\xb7',请问要怎么解决。
实际上,这段代码所出现的问题和cPickle模块没什么关系。而是Python 2显示中文“乱码”的问题。
Python 2中,str是8-bit string sequence(有点像Python 3中的bytes)。而Python 3中str就相当于Python 2中的unicode。
所以,
上例中,可以看到:
a = '上海'
a中实际存储的是:
'\xc9\xcf\xba\xa3'
这样一个字节序列。它实际上是对'上海'这个unicode字符串按gbk/cp936/gb18030编码得到的(和简体中文Windows操作系统的默认编码有关)。
给你推荐一篇博客:
http://blog.csdn.net/kiki113/article/details/4062063
下面是我写的示例:
从这个示例中可以看出,虽然把字典整个print出来不能正常解析address中的内容:
但是单独打印:
一切OK。
所以,如果真的用Python 2的话,对于该问题可以考虑手工负责编码、解码操作(如果使用print单独打印地址信息,就不用这么麻烦了,因为这些事它帮你做了)。用Python3,就没这么多问题了。
最后补充一点,pickle模块只是提供了一种序列化Python对象的方法。所以序列化生成的文件中和想象的不一样也不足为奇。正如自由de王国所说的,只要序列化后还能够反序列化成功就行了。实际上,当protocol不是0的情况下,序列化生成的文件是二进制格式的,根本没法用记事本直接看。
我用load()取出的时候显示的还是'\xe4\xb8\x8a\xe6\xb5\xb7',字典里到底有什么还是不知到啊