python基础 / DAY6 小数据池及bytes类型相关(日常总结)
#python基础 / DAY6 小数据池及bytes类型相关(日常总结)#


#字符与字节
1.1 字符与字节:
一个字符不等价于一个字节,字符是人类能够识别的符号,而这些符号要保存到计算机的存储中,就需要用计算机能够识别的字节来表示。
一个字符往往有多种表示方法(字符编码),不同的表示方法会使用不同的字节数。比如字母A-Z都可以用ASCII码表示(占一个字节),也可以用Unicode表示(占两个字节),还可以用UTF-8表示(占一个字节)。
字符编码的作用就是将人类可识别的字符转换为机器可识别的字节码,解码就是将机器可识别的字节码转换成人类可识别的字符。
Unicode才是真正的字符串,而用ASCII、UTF-8、GBK等字符编码表示的是字节串。从上面对各种编码方式的介绍中,我们也可以了解到,像ASCII、UTF-8、GBK这些都是编码方式,是将字符编码为字节码。Unicode只是一个符号集,它只规定了符号的二进制代码,也就是说它给每一个字符一个独一无二的数字来表示。
1.2 编码与解码
编码(encode):在Unicode中,每一个字符都有一个唯一的数字表示,那么将Unicode字符串转换为特定字符编码(ASCII、UTF-8、GBK)对应的字节串的过程和规则就是编码。
解码(decode):将特定字符编码(ASCII、UTF-8、GBK)的字节串转换为对应的Unicode字符串的过程和规则就是解码。
简单理解:编码是给计算机底层用的,解码是显示给人看的。
#Python中的默认编码
1.1 Python源代码文件的执行过程:
我们都知道,磁盘上的文件都是以二进制格式存放的,其中文本文件都是以某种特定编码的字节形式存放的。对于程序源代码文件的字符编码是由编辑器指定的,比如我们使用Pycharm来编写Python程序时会指定工程编码和文件编码为UTF-8,那么Python代码被保存到磁盘时就会被转换为UTF-8编码对应的字节(encode过程)后写入磁盘。
当执行Python代码文件中的代码时,Python解释器在读取Python代码文件中的字节串之后,需要将其转换为Unicode字符串(decode过程)之后才执行后续操作。
1.2 默认编码
如果我们没有在代码文件指定字符编码,Python解释器会使用哪种字符编码把从代码文件中读取到的字节转换为Unicode字符串呢?就像我们配置某些软件时,有很多默认选项一样,需要在Python解释器内部设置默认的字符编码来解决这个问题,这就是“默认编码”。
Python2和Python3的解释器使用的默认编码是不一样的,我们可以通过sys.getdefaultencoding()来获取默认编码:
1 >>> # Python2 2 >>> import sys 3 >>> sys.getdefaultencoding() 4 'ascii' 5 6 >>> # Python3 7 >>> import sys 8 >>> sys.getdefaultencoding() 9 'utf-8'


对于Python2来讲,Python解释器在读取到中文字符的字节码时,会先查看当前代码文件头部是否指明字符编码是什么。如果没有指定,则使用默认字符编码"ASCII"进行解码,导致中文字符解码失败,出现如下错误:
SyntaxError:Non-ASCII character '\xc4' in file xxx.py on line 11, but no encoding declared;
see http://python.org/dev/peps/pep-0263/ for details
对于Python3来讲,执行过程是一样的,只是Python3的解释器以"UTF-8"作为默认编码,但是这并不表示可以完全兼容中文问题。比如我们在Windows上进行开发时,Python工程及代码文件都使用的是默认的GBK编码,也就是说Python代码文件是被转换成GBK格式的字节码保存到磁盘中的。Python3的解释器执行该代码文件时,试图用UTF-8进行解码操作时,同样会解码失败,出现如下错误:
SyntaxError:Non-UTF-8 code starting with '\xc4' in file xx.py on line 11, but no encodingdeclared; see http://python.org/dev/peps/pep-0263/ for details
转载自 https://www.jianshu.com/p/19c74e76ee0a
https://chown-jane-y.github.io/2017/03/02/%E6%B5%85%E6%9E%90Python3%E4%B8%AD%E7%9A%84bytes%E5%92%8Cstr%E7%B1%BB%E5%9E%8B/#
1 ''' 2 python2 python3 3 4 ''' 5 #python2 6 #print() print 'abc' 7 #range() xrange() 生成器 8 # raw_input() 9 10 #python3 11 #print('abc') 12 #range() 13 # input() 14 15 # = 赋值 == 比较值是否相等 is 比较,比较的是内存地址 id(内容) 16 ''' 17 Python中的对象包含三要素:id、type、value 18 其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值 19 is判断的是a对象是否就是b对象,是通过id来判断的 20 ==判断的是a对象的值是否和b对象的值相等,是通过value来判断的 21 ''' 22 li1 = [1,2,3] 23 li2 = li1 24 # li3 = li2 25 print(id(li1),id(li2)) 26 27 #数字,字符串 小数据池 28 #数字的范围 -5 -- 256 29 #字符串:1,不能有特殊字符 30 # 2,s*20 还是同一个地址,s*21以后都是两个地址 31 # i1 = 6 32 # i2 = 6 33 # print(id(i1),id(i2)) 34 # i1 = 300 35 # i2 = 300 36 # print(id(i1),id(i2)) 37 38 39 #剩下的 list dict tuple set 40 # l1 = [1,] 41 # l2 = [1,] 42 # print(l1 is l2) 43 44 # s = 'alex' 45 # s1 = b'alex' 46 # print(s,type(s)) 47 # print(s1,type(s1)) 48 49 # s = '中国' 50 # print(s,type(s)) 51 # s1 = b'中国' 52 # print(s1,type(s1)) 53 54 # s1 = 'alex' 55 # # encode 编码,如何将str --> bytes, () 56 # s11 = s1.encode('utf-8') 57 # s11 = s1.encode('gbk') 58 # print(s11) 59 # s2 = '中国' 60 # s22 = s2.encode('utf-8') 61 # s22 = s2.encode('gbk') 62 # print(s22)
浙公网安备 33010602011771号