08 字符编码
一、字符编码
1.什么是字符编码
字符编码中的编码指的是翻译或者转换的意思,即将人能理解的字符翻译成计算机能识别的数字
字符——》翻译——》数字
2.字符编码发展史(了解)
2.1阶段一:一家独大
计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表
ASCII表的特点: 1、只有英文字符与数字的一一对应关系 2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
2.2阶段二:诸侯割据、天下大乱
GBK表的特点:(中文、英文) 1、只有中文字符、英文字符与数字的一一对应关系 2、一个英文字符对应1Bytes 一个中文字符对应2Bytes 补充说明: 1Bytes=8bit,8bit最多包含256个数字,可以对应256个字
符,足够表示所有英文字符 2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
Shift_JIS表的特点:(日文、英文) 1、只有日文字符、英文字符与数字的一一对应关系 Euc-kr表的特点:(韩文、英文) 1、只有韩文字符、英文字符与数字的一一对应关系
2.3阶段三:分久必合
英文字符可以被ASCII识别
英文字符--->unciode格式的数字--->ASCII格式的数字
中文字符、英文字符可以被GBK识别
中文字符、英文字符--->unicode格式的数字--->gbk格式的数字
日文字符、英文字符可以被shift-JIS识别
日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字
3.编码与解码
由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode
由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode
# 编码 编码
# 字符---------》unicode格式----------》utf-8格式
x = "上"
res = x.encode('utf-8')
# print(res,type(res))
# 解码 解码
# 字符<---------unicode格式<----------utf-8格式
print(res.decode('utf-8'))
4.utf-8的由来
多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(GBK格式的二进制)
多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(Shift_JIS格式的二进制)
多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(???格式的二进制)
理论上是可以将内存中unicode格式的二进制直接存放于硬盘中的,但由于unicode固定使用两个字节来存储一个字符,如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可),然而空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(utf-8格式的二进制)
二字符编码的应用
总结:1. 保证存的时候不乱:在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式
2. 保证存的时候不乱:在由硬盘读入内存时,必须采用与写入硬盘时相同的编码格式
若想保证不乱码
1、保证存不乱
存入硬盘的编码格式要能识别输入的字符
2、保证读不乱
存取硬盘用得都是同一种字符编码格式
3、往硬盘存的新文件以后都存成utf-8格式
1. 文本编辑器nodpad++存取文本文件
文本编辑器存取的都是文本文件,而文本文件中包含的内容全为字符,所以存取文本文件都涉及到字符编码的问题
2. pytho解释器执行文件的前两个阶段
python3中默认为utf-8
python2中默认为ASCII 在指定的文件头修改默认的编码(在python文件的首行写coding:当初文件写入硬盘时采用的编码格式)
3. python解释器执行文件的第三个阶段
在Python3中,字符串类的值都是使用unicode格式来存储
在Python2中是按照文件头指定的编码来存储字符串类型的值的(如果文件头中没有指定编码,那么解释器会按照它自己默认的编码方式来存储‘上’) 补救措施,就是在字符串类型前加u,则会将字符串类型强制存储 x=u"上"
4 字符串encode编码与decode解码的使用
1.unicode格式编码 X="上" res=x.encode("utf-8") res,type(res) (b'\xe4\xb8\x8a', <class 'bytes'>) 2.其他编码格式 res.decode("utf-8") "上"