Python2与Python3的编码区别

1. str和bytes

1.1 str是文本,bytes是字节

文本是有编码的(UTF-8,GBK,GB2312等)
字节没有编码

文本的编码指的是字符如何使用字节来表示组织方式,linux下默认都使用UTF-8
通过b前缀可以定义bytes

2. Python2和Python3的编码

2.1 Python2

在python2 中是不区分bytes和str类型的,在python3中bytes和str中是区分的,str的所有操作bytes都支持

  • python2
    这里写图片描述

  • python3
    这里写图片描述

除了encode外,str操作都有对应的bytes版本,但是传入的参数必须是bytes

2.2 Python3

2.2.1 bytes与str之间的转换——-编码

bytes由str通过encode方法转化得到的
str也可以通过bytes 通过decode方法转化得到

GBK 是双字节,UTF-8 灵活编码,1字节,2字节,3字节,4字节都有,最大支持6字节长度,中文大多数是3字节

简单来讲:
py3中,str就相当于java中的tostring()方法

这里写图片描述

当一段字符以不同的形式编码后,所对应的字节是不一样的
比如:
这里写图片描述

1. encode转化后的字节流bytes是不是字符串?

bytes不是字符串str。在python3中,bytes是字节流bytes对象,字符串是字符串str对象。

2. 同样是对字符串进行encode(),为什么有的结果是字母,而有的是十六进制\x

这里写图片描述

编码的实际作用就是把一个字符串转化为编码对应的字节形式.

注意:在运行界面输出bytes时候,它是采取这样的原则的:每读一个字节就和ascii码比对一下,如果符合ascii码的可显示字符(特殊字符,字母和数字,控制字符除外),那这个字节就按照ascii码来表示,否则就按十六进制\x某某来表示。

比如“abc中国”进行utf-8编码后(encode()默认以utf-8形式),得到的字节如下:
这里写图片描述

当在界面输出bytes的时候,会依次读取每一个字节,并与ASCII编码进行比较。因为前三个字节正好在ASCII编码表中能够查到,所以直接显示其对应的字符。
这里写图片描述

对于汉字“中”的字节十六进制字节E4B8AD中的第一个字节E4,对应的十进制是228,不在ASCII编码范围内,所以在界面输出时,直接输出十六进制

3. 那如何定义bytes变量呢?

直接用b’字符串’表示bytes对象,字符串形式可以是ASCII范围内的字符,也可以说十六进制字符串,但不能是中文

这里写图片描述

同样,在界面输出时,它会将每个字符依次在ASCII中进行查找。

4. 英文编码和中文编码的区别

这里写图片描述

5. Python程序编辑界面的unicode码u’a’是字符串还是字节码?unicode码又怎么表示?

u ‘a’ 不是字节码,是字符串。也就是说,在Python3中,u ‘a’就是str对象
这里写图片描述

下图中的表达,第一个”\u”表示Unicode编码,第二个”\”是一个反义字符
这里写图片描述

6. 如果它表示字符串,那怎么转化为unicode码?用encode指定unicode方式?

这里写图片描述

7. len()

bytes和str对象除了decode()和encode()方法不同外,其他str有的方法bytes一般都有

这里写图片描述

2.2 使用utf-8进行转换

在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换

参考
http://www.jianshu.com/p/6cbb2b14cda9

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值