您的位置:首页 > 编程语言 > Python开发

python中文乱码总结

2016-12-23 14:18 381 查看
1、python2中的字符编码

str每个字符由8位字节表示,unicode每个字是由16位二进制数字表示。

有一个中文字符串:“授权token过期”,可以保存成string类型,也可以保存成为unicode类型;

使用unicode编码,则为:
>>> t=u"\u6388\u6743token\u8fc7\u671f"
>>> print t
授权token过期
>>> print isinstance(t, unicode)
True


使用string编码,则是:
>>> s="\xe6\x8e\x88\xe6\x9d\x83token\xe8\xbf\x87\xe6\x9c\x9f"
>>> print s


授权token过期
>>> print isinstance(s, str)
True


注:还需要将客户端xshell的显示格式设置为Unicode(UTF-8),否则显示是乱码,而不是中文字符

2、requests中的response返回信息

在调用HTTP请求时使用requests进行封装,返回存放在Response对象里,这个对象的text是unicode,content字段是string类型,如下:
-> ret, content = self.process_request(method, url, headers, params)
(Pdb) n
-> if ret.status_code == 200:
(Pdb) p ret.content
'{"status":1,"info":"\xe4\xbb\xbb\xe5\x8a\xa1url\xe6\xa0\xbc\xe5\xbc\x8f\xe9\x94\x99\xe8\xaf\xaf\xe6\x88\x96\xe4\xb8\xba\xe7\xa9\xba","error_code":10001}'
(Pdb) p ret.content.decode("utf-8") #将string转换成unicode编码
u'{"status":1,"info":"\u4efb\u52a1url\u683c\u5f0f\u9519\u8bef\u6216\u4e3a\u7a7a","error_code":10001}'
(Pdb) p ret.text
u'{"status":1,"info":"\u4efb\u52a1url\u683c\u5f0f\u9519\u8bef\u6216\u4e3a\u7a7a","error_code":10001}'
(Pdb) p ret.text.encode('utf-8') #将unicode转换成string
'{"status":1,"info":"\xe4\xbb\xbb\xe5\x8a\xa1url\xe6\xa0\xbc\xe5\xbc\x8f\xe9\x94\x99\xe8\xaf\xaf\xe6\x88\x96\xe4\xb8\xba\xe7\xa9\xba","error_code":10001}'


3.一个例子

>>> m="授权token过期"
>>> print m
授权token过期
>>> print isinstance(m, str)
True
>>> print isinstance(m, unicode)
False
>>>
>>> n=u"授权token过期"
>>> print n
授权token过期
>>> print isinstance(n, unicode)
True
>>> print isinstance(n, str)
False

>>> print m.decode('utf-8') #将string类型解码成utf类型,这时候shell设置为Unicode(UTF-8),则显示正常
授权token过期
>>> print m.decode('gbk') #将string类型解码成gbk类型,这时候shell设置为Unicode(UTF-8),则显示成乱码
鎺堟潈token杩囨湡
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: