python3乱码问题:接口返回数据中文乱码问题解决
昨天测试接口出现有一个接口中文乱码问题,现象:
1 浏览器请求返回显示正常
2 用代码请求接口返回数据中文显示乱码
3 使用的python3,python3默认unicode编码,中文都是可以正常显示的。直接打印中文,其他接口中的中文都正常
百思不得其解,跟开发确认接口编码方式 ,也是是utf-8. 跟其他接口一样
折腾蛮久,最后的解决思路:
1 把浏览器返回的中文进行utf-8加密
2 对比步骤1的加密串 与 乱码的区别,发现两者的字节码是一样的,只是显示形式不同,一个是b'xxx',另一个‘xxx’。终于找到了解决方式
#-*-coding:utf-8 -*- ''' dinghanhua 2018-11-09 解决接口返回数据乱码问题 现象:浏览器请求接口数据正常, python3请求接口,返回数据中文显示乱码。 对比中文utf-8编码和接口返回数据,发现返回数据里字节码前没有加上b ''' '''中文utf-8编码,再解码''' str = '稳定' print('稳定 utf-8 编码是:',str.encode('utf-8')) print('稳定 utf-8-sig 编码是:(加了3个前缀)',str.encode('utf-8-sig')) print('都可以直接通过utf-8 解码:',b'\xe7\xa8\xb3\xe5\xae\x9a'.decode('utf-8'), b'\xef\xbb\xbf\xe7\xa8\xb3\xe5\xae\x9a'.decode('utf-8')) '''utf-8编码串拷出来为啥显示乱码''' str = b'\xe7\xa8\xb3\xe5\xae\x9a' print('写了b,显示正常: ',str,str.decode('utf-8')) str_without_b = '\xe7\xa8\xb3\xe5\xae\x9a' print('少了前面的b,打出来显示乱码: ', str_without_b) print('实际上也就是ascii编码:',ascii('稳å®')) '''问题解决方式:用raw_unicode_escape编码''' str = str_without_b.encode('raw_unicode_escape') print('raw_unicode_escape 编码后:',str) print('再用utf-8解码:',str.decode('utf-8'))
the end!
当情绪低落,烦躁的时候,学技术并整理成博客能忘却所有烦恼。技术改变心境。