python 序列化

python的字符集真是麻烦,先看没有做pickle的情况,一切正常:

>>> val = u'中文¥200'
>>> k = blogQueryService.testPickle(val)
[('param1', u'\u4e2d\u6587\xa5200')]
>>> k
'\xe4\xb8\xad\xe6\x96\x87\xc2\xa5200'
>>> print k
中文¥200

 blogQueryService.testPickle(val) 返回的是str类型,所以返回的是\xe4编码格式。

但如果对val做picke呢?

>>> from cStringIO import StringIO
>>> import cPickle as pickle
>>> pickler=pickle.Pickler
>>> unpickler=pickle.Unpickler
>>> 
>>> val = u'中文¥200'
>>> 
>>> file = StringIO()
>>> _pk = pickler(file)
>>> val = file.getvalue()
>>> 
>>> val
'V\\u4e2d\\u6587\xa5200\np1\n.'
>>> k = blogQueryService.testPickle(val)
[('param1', 'V\\u4e2d\\u6587\xa5200\np1\n.')]
>>> k
'V\\u4e2d\\u6587\xef\xbf\xbd200\np1\n.'
>>> 

传递的参数:

'V\\u4e2d\\u6587\xa5200\np1\n.'

返回的数值:

'V\\u4e2d\\u6587\xef\xbf\xbd200\np1\n.'

\xa5 变成 \xef\xbf\xbd

这说明在序列化时采用unicode编码是问题的,比如:

 

 

python貌似对utf-8编码是单独新搞了一个unicode 类型,

 换句话说对于str类型只能采用默认的编码格式,如果要采用utf-8编码就会变成unicode类型。

>>> val = '中文¥200'
>>> val
'\xe4\xb8\xad\xe6\x96\x87\xc2\xa5200'
>>> k = val.decode('utf8')
>>> k
u'\u4e2d\u6587\xa5200'
>>> type(k)  
<type 'unicode'>
>>> str(k)  #转换成str,编码格式又变回\xe4
'\xe4\xb8\xad\xe6\x96\x87\xc2\xa5200'


 

 

 repr()

猜你喜欢

转载自san-yun.iteye.com/blog/1815518
今日推荐