Python3 到底什么是字符编码

我之前老是有这种感觉, 就是明明已经看过很多关于字符编码的资料了, 感觉字符编码相关的知识点不难理解, 觉得自己已经把字符编码给弄懂了, 但当别人问我到底什么是字符编码, Unicode是什么啊, UTF-8又是什么的时候, 我又结结巴巴的说不清楚, 或者只能给个含糊不清的回答, 老是把相关的知识点给弄混. 所以这篇博客, 就是要把字符编码给真正的搞懂, 把相关的知识点梳理清楚.

到底什么是字! 符! 编! 码?!!!

我们所理解的"字符编码(名词)"包含两个部分: 
	1.字符集
	2.编码规则
	
字符集, 做了什么事情呢? 其实就是给一个字符指定一个数字编号, 
就像我们每个人都会有一个身份证号一样, 通过一个身份证号可以对应某一个人, 
那我们通过数字编号, 就可以对应到某个具体的字符了
所以, 简单来说, 字符集就相当于一个大的数据库, 这个数据库中包含了两个字段(列): 字符, 和字符对应的编号	
+------+----------+
| 字符 |    编号   |
+------+----------+
|   a  |     97   |
+------+----------+
|   b  |     98   |
+------+----------+

编码规则, 就是如何对"字符的编号"进行编码的一种规则, 比如我们现在要将字母 "a" 保存到硬盘中, 
"a"对应的编号是97, 所以我们只要保存97就行了, 按照ASCII的编码规则, 使用8位二进制数(第1位二进制为0)来进行编码, 
97在经过编码后的存储格式就为01100001

为什么要有字符编码?

归根结底, 计算机只认识0和1(二进制), 不是0和1的数字, 我们可以通过位数转换, 转换成二进制
那对于字符, 计算机要怎么识别呢?
将每个字符都指定一个数字编号(字符集), 再将数字编号转为二进制(编码规则), 这样计算机就能识别了

Unicode与UTF-8

首先, Unicode也是包含两个部分: 字符集+编码规则
你可以将Unicode字符集理解为是包含了全世界大多数语言字符与字符编号的超大数据库
而UTF-8就是Unicode的一种编码规则, 除了UTF-8, 还有UTF-16、UTF-32等编码规则
	UTF-32: 不管你的编号是多少, 即使是1, 我都给你转为用32位的二进制: 00000000 00000000 00000000 00000001
	UTF-16: 能转为16位就转为16位, 16位不够就转为32位
	UTF-8: 能转为8位就转8位, 8位不够就转16位,  16位不够就转24位, 24位不够转32位

Python2和Python3中的字符编码

python2默认字符编码是ASCII, 当你用python2的解释器去运行你写好的py2代码(硬盘中), 
解释器会用ASCII的编码规则去读取, 由于ACSII编码不支持中文, 
所以我们一般在py2代码首行: #encoding: utf-8来指定字符编码规则为utf-8

python3默认的字符编码是Unicode, 当你用python3的解释器去执行你写好的py3代码(硬盘中), 
解释器会用UTF-8编码规则来读取

Python2和Python3中的字符串

python2中的字符串的str和unicode类型
	name = "bigb"  (就是py3中的bytes类型)
	name = u"bigb" (就是py3中的str类型)
	
python3中的字符串的str和bytes类型
	name = "bigb"
	name = b"bigb"

注:

只是对相关概念做了简单阐述, 目的是理清字符编码的相关知识点, 如果对字符编码有深入了解的需求, 请自行查阅相关资料

原文地址:https://www.cnblogs.com/bigb/p/12114685.html