python的unicode、str、byte的关系

python的unicode、str、byte的关系

作为一个用惯了python3的人,在python2如此操蛋的编码问题中,不得不整理一下python2中字符串和字节串之间的关系。
先说一个原理,python中字节串可以解码成字符串,字符串可以编码成字节串
byte->decode
string->encode

Python3中的编码方式

文本字符串类型(Unicode编码)被命名为 str , 字节字符串类型被命名为 bytes ,就这两种。其中,str有encode方法,byte有decode方法
python3的字符串对象

总结python3的特点

str表示字符串,byte表示字节串

Python2中的编码方式

but! python2有unicode、str两种对象,首先,python2的str其实是byte存储的,也就是说,python3里面的byte里面存的东西和python2str里面存的是一样的。然后,python3里面的str对象在python2里面叫做unicode对象。
关于python2中的两种对象,使用方法如下:
Python2 str 有decode方法
Python2 unicode有encode方法
操作如下:
python2字符操作
以上两种方法
其实python2也有byte类的声明,但是Python2的byte和str其实是一种东西:
byte声明

Python2的隐式转换

大家要注意的是,Python2中str有一个encode方法,unicode有一个decode方法,这两个方法没软用。
如果对str调用encode方法,python会隐式的先对str调用decode方法获取对应的字符串,然后再对字符串调用encode方法:
python2的隐式转换
上面的例子中

b.decode('GBK')
b.encode('ascii').decode('GBK')

两行代码是一样的

总结python2的特点

str表示字节串,unicode表示字符串


最后一句话,搞清楚字节串和字符串,字节串可以解码,字符串可以编码。

奇特的unicode_escape与string_escape

关于python2的encode方法中,有一类把字节串变成真正的转义字节串的方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mk9Pxq6C-1598628353323)(https://upload-images.jianshu.io/upload_images/13139536-6f3d957c7ed01c71.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
其中这个字符完全的变了长度,换了模样
还有一个unicode-escape,这两个方法比较特殊,其中

  • 对str调用encode(‘string_escape’),可以把str变成str,内容转义

  • 对str调用decode(‘string_escape’),可以把str变成str,内容逆转义

  • 对str调用decode(‘unicode_escape’),可以把str变成unicode,内容一定要是unicode转义过的字符,否则会变成奇奇怪怪的东西

  • 对str调用encode(‘unicode_escape’),等于.decode(‘ascii’).encode(‘unicode_escape’),隐式转义会导致非ascii码报错
    str转义

  • 对unicode调用encode(‘unicode_escape’),可以把unicode变成str,内容转义

  • 对unicode调用decode(‘unicode_escape’),等于.encode(‘ascii’).decode(‘unicode_escape’),隐式转义会导致非ascii码报错

  • 对unicode调用encode(‘string_escape’),函数报错,报错内容为只能针对str操作

  • 对unicode调用decode(‘string_escape’),等于.encode(‘ascii’).decode(‘string_escape’),隐式转义会导致非ascii码报错
    unicode转义

总结

  1. 对str可以调用decode方法,将内容逆转义回来,但是多了一个encode(‘string_escape’)而且不报错(个人感觉很神奇)
  2. 对encode可以调用encode(‘unicode_escape’)方法

ref:

  1. PYTHON编码的前世今生http://python.jobbole.com/86578/
  2. Python2和Python3之间关于字符串编码处理的差别https://blog.csdn.net/yanghuan313/article/details/63262477
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值