Python bytes类型介绍
Python 2 —— bytes类型
1 >>> s = "路飞"
2 >>> prints3 路飞4 >>>s5 '\xe8\xb7\xaf\xe9\xa3\x9e'
虽说打印的是路飞,但直接调用变量s,看到的却是一个个的16进制表示的“二进制字节”,我们如何称呼这样的数据呢?直接叫“二进制”?可以的,但相比与0101000111,这个“数据串”在表现形式上又把2进制转成了16进制来表示,这是为什么呢?为的就是让人们看起来更可读。我们称之为bytes类型,即字节类型。它把8个二进制一组称为byte,用16进制来表示。
1 >>>type(s)2
3 >>>bytes4
5 >>> s = "路飞" #定义"路飞"
6 >>> s1 = b"路飞" #定义“\xc2\xb7\xb7\xc9”
7 >>>s18 '\xc2\xb7\xb7\xc9'
Python2中的字符串更应该称为字节串,我们通过存储方式就能看出来,但Python2中还有一个类型是bytes。在Python2作用,bytes==str,就是这么回事。
图片没有字符编码
Python3与2字符串的区别
图片在内存中的显示
f = open('课程介绍.png')
a=f.read()
a
如何让 Python2 实现 写一个软件,在全球各国的电脑上直接看?
以 unicode 编码写你的软件
python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode
1 >>>s2 '\xe8\xb7\xaf\xe9\xa3\x9e' #utf-8
3 >>> s.decode('utf-8')4 u'\u8def\u98de' #unicode 在unicode编码表里对应的位置
5 >>> print(s.decode('utf-8'))6 路飞 #unicode 格式的字符
Python3与2编码总结
Python 发展历史
由于Python创始人在开发初期认知的局限性,其并未预料到python能发展成一个全球流行的语言,导致其开发初期并没有把支持全球各国语言当做重要的事情来做,所以就轻佻的把ASCII当做了默认编码。 当后来大家对支持汉字、日文、法语等语言的呼声越来越高时,Python于是准备引入unicode,但若直接把默认编码改成unicode的话是不现实的, 因为很多软件就是基于之前的默认编码ASCII开发的,编码一换,那些软件的编码就都乱了。所以Python 2 就直接 搞了一个新的字符类型,就叫unicode类型,比如你想让你的中文在全球所有电脑上正常显示,在内存里就得把字符串存成unicode类型。
1 >>> s = "路飞"
2 >>>s3 '\xe8\xb7\xaf\xe9\xa3\x9e'
4 >>> s2 = s.decode("utf-8")5 >>>s26 u'\u8def\u98de'
7 >>>type(s2)8
到了2008年,python发展已近20年,创始人龟叔越来越觉得python里的好多东西已发展的不像他的初衷那样,开始变得臃肿、不简洁、且有些设计让人摸不到头脑,比如unicode 与str类型,str 与bytes类型的关系,这给很多python程序员造成了困扰。
龟叔再也忍不了,像之前一样的修修补补已不能让Python变的更好,于是来了个大变革,Python3横空出世,不兼容python2,python3比python2做了非常多的改进,其中一个就是终于把字符串变成了unicode,文件默认编码变成了utf-8,这意味着,只要用python3,无论你的程序是以哪种编码开发的,都可以在全球各国电脑上正常显示了。
PY3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分, str 就是unicode格式的字符, bytes就是单纯二进制了。
为什么在py3里,把unicode编码后,字符串就变成了bytes格式? 你直接给我直接打印成gbk的字符展示不好么?
就是想通过这样的方式明确的告诉你,想在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。
常见编码错误的原因有:
1、Python解释器的默认编码
2、Python源文件文件编码
3、Terminal使用的编码
4、操作系统的语言设置
掌握了编码之前的关系后,挨个排错就好了
将 utf-8编码 转换为 GBK编码(轻易不要转换编码,因为转编码是不可逆的)