首页 » 编程 » Python基础 » 正文

字符编码,bytes数据类型

Python学习日记-day17


字符编码是个很麻烦的事情,不管是在python还是在其他语言中都需要处理各种编码问题,python2有需要处理编码的需求,在python3中不区分编码,在内存中都是Unicode,就不存在编码问题。


以下例子基于python2:

python2中如程序里有中文需要先定义编码,否则乱码

# _*_ coding:utf-8 _*_

name = "中国"

print name


在不同的编码环境中,如在windows机器上,我的系统CMD编码是GBK,PyCharm编码是UTF-8,同样的代码便会有不同的结果:

name = "中国"

print name.decode("utf-8")

这段代码的意思是将“中国”decode转为了unicode utf-8,这段代码在cmd和pycharm的结果都是一样的,是因为name转为unicode后,显示结果会根据终端屏幕的编码再次进行自动的encode转换,转换为终端的编码,在cmd里会再自动转为cdm的编码GBK进行显示,在PyCharm里转为PyCharm的编码utf-8进行显示,所以看到的结果都是正常显示的“中国”,但如果要进行强转,如下面的代码:

print name.decode("utf-8").encode("GBK")

此代码转为unicode后,又强制的指定了要最终将编码转为了GBK,在cmd中运行没有问题会正常显示,因为cmd编码就是GBK,但是由于PyCharm编码是UTF-8,所以PyCharm中运行会乱码


abc.png




unicode打印的是字符数,其他打印的是字节数。

bbbb.png




bytes数据类型

bytes,字节类型(二进制类型),就是一个8bits的字节,所有的字符要存到内存,硬盘或者网络发送,都是bytes格式。


在python2里,看到的字符串就是bytes,unicode是unicode

在python3里,字符串是unicode,bytes就是bytes


在python3里

    所有的字符在内存里都是unicode

    解释器读取文件的默认编码是utf-8,但是如果有个文件的编码是gbk,读到内存里还是需要解码

    

ccc.png


上图关于存硬盘:

python2里,由于str就是bytes 就直接存到硬盘了;

python3里,由于str是unicode,存到硬盘需要明确的指定转为bytes



在python2里encode是转成了指定的编码

在python3里encode会把unicode转成相应编码的同时,把字符变成bytes

ddd.png






发表评论

验证码加载中....