python二进制串转字符串,正常显示中文

"这篇博客介绍了Python中二进制数据的处理方法,包括如何从字符串转为二进制,以及如何处理含有中文的二进制数据。通过encode和decode函数进行ASCII和UTF-8编码的转换,并展示了在遇到u编码时如何使用unicode_escape进行解码。此外,还提到了使用json库作为简便的方法来自动检测和处理编码,但要注意它会返回Python对象而非字符串。"
摘要由CSDN通过智能技术生成

一 不含中文

首先明确b'xxx'这种样式的不是字符串类型,而是二进制数据:

In [1]: s = 'hello world'

In [2]: s.encode('ascii')
Out[2]: b'hello world'

In [3]: type(s)
Out[3]: str

In [4]: type(s.encode('ascii'))
Out[4]: bytes

如果不含中文,直接使用str/decode均可,但str出来的多了个b',需要注意:

In [5]: b = s.encode('ascii')

In [6]: b
Out[6]: b'hello world'

In [7]: str(b)
Out[7]: "b'hello world'"

In [8]: b.decode('utf-8')
Out[8]: 'hello world'

含有中文

  1. 假设得到一个这样的二进制串:
b'\xe5\x93\x88\xe5\x96\xbd'

如果对编码比较熟悉的伙伴直接看出来这是utf-8编码的二进制串,此时直接解码即可:

In [15]: b
Out[15]: b'\xe5\x93\x88\xe5\x96\xbd'

In [16]: b.decode('utf-8')
Out[16]: '哈喽'
  1. 假设得到一个这样的二进制串:
b'{"errno":0,"data":[{"k":"\\u5468\\u6770\\u4f26","v":"\\u540d. Jay Chou; The New King of Asian Pop \\u4ee3. \\u65e0\\u4e0e\\u4f26\\u6bd4"}]}'

\u开头稍微有点陌生,但搜索一下可以查到解码方法:

In [17]: b'{"errno":0,"data":[{"k":"\\u5468\\u6770\\u4f26","v":"\\u540d. Jay Cho
    ...: u; The New King of Asian Pop \\u4ee3. \\u65e0\\u4e0e\\u4f26\\u6bd4"}]}'
    ...: .decode('unicode_escape')
Out[17]: '{"errno":0,"data":[{"k":"周杰伦","v":"名. Jay Chou; The New King of Asian Pop 代. 无与伦比"}]}'
  1. 简便方法
    上述方法需要提前知道编码,有一种简便方法:使用json,可以自动检测编码,但需要注意的是,它返回的是python对象,不一定是字符串,具体是什么对象要视原始内容而定:
In [20]: json.loads(b'{"errno":0,"data":[{"k":"\\u5468\\u6770\\u4f26","v":"\\u540d. Jay Chou; The New King of Asian Pop \\u
    ...: 4ee3. \\u65e0\\u4e0e\\u4f26\\u6bd4"}]}')
Out[20]: 
{'errno': 0,
 'data': [{'k': '周杰伦', 'v': '名. Jay Chou; The New King of Asian Pop 代. 无与伦比'}]}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值