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'