Python-字符编码
字符编码
什么是字符编码
字符是我们人类能够读懂的字符,想让计算机读懂这些字符,必须要经过以下过程:
字符--》翻译过程--》数字(0101)
简而言之,字符编码就是将人类的字符翻译成计算机能够识别的数字,这种转换必须遵循一固定的标准,来表示字符与数字的对应关系,这个关系就是字符编码表
字符编码表发展与分类
-
早期由美国人发明,称为ASCIl。规定了一些数字和一些特殊符号的对应关系.ASCIl最多只能表示256个符号,也就是256个对应关系
早期用英文编程没问题,ASCIl码够用,但是中国、韩国、日本也有自己的语言如果这时候还来用ASCIL码来编码各个国家的字符的时候就不能找到对应的关系了,就会出现乱码的情况。
于是,各个国家发明了他们属于自己的编码
中国 gb2312、gbk
韩国 euc-kr
日本 shift
再读取字符的时候按照各个国家的编码标准会出现乱码(因为此刻的各种标准都只是规定了自己国家的文字在内的字符跟数字的对应关系,如果单纯采用一种国家的编码格式,那么其余国家语言的文字在解析时就会出现乱码)。所以迫切需要一个世界的标准(能包含全世界的语言)
- Unicode应运而生。unicode的对应关系更多,表示着存储的字符会更多,占用内存会更大,在存储和传输上十分的低效。
后来出现了把Unicode编码转化为“可变长编码”的UTF-8(Unicode Transformation Format-8)编码。uft8占用内存更小,更适合存储数据。
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
- 读入内存利用unicode编码
字符编码应用之Python
执行python程序的三个阶段
-
启动python解释器
此时python解释器就相当于一个纯文本编辑器,默认是utf8编码编写字符
-
读代码
文本编辑器从硬盘中读取内容默认使用utf8编码格式读取,如果不是utf8写的字符读取的时候则会乱码
也可以指定python解释器读取内容的编码是什么格式
# coding=gbk
,这样python解释器就以gbk格式读取,以gbk写的字符就不会出现乱码了。加载到内存默认使用unicode编码格式
-
执行,产生结果
执行过程中会在内存中开辟新的内存空间
python2 与 python3 字符串类型的区别
Python2
-
str
当python执行到产生字符串的代码时,将字符串编码成文件开头指定的编码格式
-
Unicode
当python执行到产生字符串的代码时,在变量值前面加上
u
表示用unicode编码格式
Python3
Python3中字符串类型都是Unicode编码的,所以Python3中的字符串类型的数据可以编码成其他字符编码的格式。
在Python3中无论指定了什么字符编码,在内存存取时都会使用Unicode编码去入内存,Unicode编码可以和任意的字符编码相互转换,并在读取时按照所需的编码区读取,这样就很好解决了字符编码的问题
总结
字符按照什么标准而编码的,就要按照什么标准解码
(按照什么方式存的,就按什么方式取就不会乱码)
-
为了处理英文字符,产生了ASCII码。
-
为了处理中文字符,产生了GB2312。
-
为了处理各国字符,产生了Unicode。
-
为了提高Unicode存储和传输性能,产生了UTF-8,它是Unicode的一种实现形式。
运行环境的影响
搞清楚了上面介绍的各种编码格式之后,接下来我们就开始详细讲解为什么会出现乱码了。关于乱码,大家记住两个要点:
(1)所谓乱码的本质是字符的编码格式与显示字符的环境编码格式不一致引起的。这句话告诉我们要解决乱码问题,我们需要知道两个信息,一个是字符本身是什么编码,另一个就是显示字符的环境编码是什么,两者必须一致,才能显示出正确的内容。
(2)由于Unicode编码是标准编码格式,也可以看做是没有任何特定编码格式的“无编码”模式。所以,对于任何Unicode类型编码的字符,打印时python会自动根据环境编码转为特定编码后再显示。