Python关于编码的一些总结
(关于学习廖雪峰Python教程的一些个人总结)
首先你一定听过Unicode,UTF-8,ASCII编码。
在编码使用的字节长度上:
ASCII:美国人发明,最早只有127个字符(包括大小写英文,数字,符号)被编码到计算机里,只用一个字节表示。
Unicode:但是每个国家都有自己的语言,一个字节肯定不够,就得需要两个或者更多字节表示,每个国家都制定了自己的编码标准,比如中国的GB2312编码,但是这样容易冲突导致乱码。所以Unicode标准产生,统一所有语言,通常用两个字节表示一个字符(生僻字可能用到四个字节),这样像ASSCII这样只需一个字节编码的符号,只需在前面补零。比如’A’的ASCII二进制是01000001,Unicode就是00000000 01000001。
UTF-8:但是在传输和存储上,如果含有大量ASCII里面的字符,使用Unicode编码就会导致传输效率低下,浪费存储空间,本着节约的原则,就有了可变长编码UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
下面表格表示了同一个字符不同编码的区别(二进制表示):
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分。
在计算机系统中编码工作方式上:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
比如有两个例子:
1、用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
2、浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
关于编码和解码
通俗来讲,编码就是把字符串或数据编码成人看不懂的东西(以字节为单位的bytes),但是对计算机来说很爽,比如存储和传输很方便,解码就是把编码后的字符串再解码回人能看懂的字符串。
Python3的字符串类型是str
,内存中以Unicode编码,
你可能见过下面这些东西
b'\xe4\xb8\xad\xe6\x96\x87'
b'\u4e2d\u6587'
第一行\x开头的一串就是’中文’这个字符串用UTF-8编码后的形式(bytes对象),第二行\u开头的是’中文’这个字符串的Unicode编码形式,所以编码encode就是把人看懂的字符串编码成人看不懂但是计算机能看懂的东西。
解码就是把bytes解码成人能看懂的
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
b'\u4e2d\u6587'.decode('unicode_escape')
## '中文'
关于字符串前面的字母
你可能见过下面这些东西
b'\xe4\xb8\xad\xe6\x96\x87'
u'中文'
r'\n\n\n\n'
第一行b'\xe4\xb8\xad\xe6\x96\x87'
上面我们见到了,它表示这是一个bytes对象,也就是编码后的结果,而不是str
,不是str
,不是str
,不是字符串,它具有decode方法,可以解码成字符串,也就是可以这样写:
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
但是你这样写就不行
'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
因为这样写表示这是个字符串,解释器会报错告诉你str
类型没有decode方法。
第二行u'中文'
表示字符串以Unicode格式进行编码,一般用在中文字符串前面。
第三行r'\n\n\n\n'
表示去转义,即r后面跟着的字符串中有啥打印啥,不会出现转义字符
print(r'\n\n\n\n')
结果会是’\n\n\n\n’,而不是四个换行符。
关于Python文件(.py
文件)开头的注释
你可能见到过别人的项目Python文件开头有这样的注释
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。