字符编码
1、储备知识
1、程序运行与三大核心硬件的关系:CPU、内存、硬盘
程序最先放在硬盘中,程序的运行是先把程序的代码从硬盘读入内存,然后cpu从内存读取指令然后运行
2、程序运行过程中产生的数据最先放在内存中
python3、程序运行的三个步骤
python3 D:\a.py
1、先启动python解释器
2、解释器会将a.py的内容当成普通内存从硬盘读入内存,此时没有语法意义
3、解释器会解释执行刚刚读入内存的内存,开始识别python语法
4、文件的后缀名是干嘛的
文件的后缀名仅仅是给人看的 因为对应计算机来说所有的数据都是0101010的二进制
5、普通的文本编辑器和python解释器的工作流程
相同
1.任何的程序要想运行都是先从硬盘读取到内存
2.文本编辑器和python解释器都会去硬盘中读取你想要读取的文件内容
不同
3.文本编辑器将文件内容读取之后仅仅是展示给用户看
而我们的python解释器会识别语法并执行python代码
2、什么是字符编码
字符编码表:存放的是字符与数字的对应关系
字符---------(标准)---------------数字
字符编码研究的范围只针对文本文件 音频、视频这些不包含在内
3、字符编码的发展史
一家独大
计算机起源于美国,美国人用英文交流,但是计算机只能识别二进制数据,为了能够让计算机识别人类能够读懂的字符,这里面肯定有一个中间的字符与数字的对应关系,其实就是一张表:ASCII码表。这张表只记录了英文和数字的对应关系。用8位(bit)来表示一个英文字符。
1bytes = 8bit
1024bytes = 1KB
1024KB = 1MB
1024MB = 1GB
ASCII:只能识别英文字符
特点:采用8bit对应一个英文字符
群雄割据
中国人也用得起计算机,自己做一个汉字跟数字对应关系:GBK表。汉字、英文 跟数字的对应
1bytes来表示英文,2bytes来表示汉字,如果出现了生僻字可能还需要用3bytes甚至跟多的bytes。
GBK表:可以识别中文字符串与英文字符
特点:采用16bit对应字符,该字符可以是英文字符、也可以是中文字符
日本人也用得起计算机,自己做一个汉字跟数字对应关系 shift_JIS,shift_JIS表:日文、英文 跟数字的对应
韩国人也用得起计算机,自己做一个汉字跟数字对应关系 Euc_kr,Euc_kr表:韩文、英文 跟数字的对应
我们在输入中文字符的时候
1.内部基于GBK翻译成了对应的二进制数据 在内存
2.然后将基于GBK编码的二进制数据刷到硬盘 永久保存
3.将硬盘中基于GBK编码的二进制数据读取到内存之后按照GBK编码的对应关系翻译成对应的中文
天下一统
万国码 unicode,兼容万国,并且跟之前所有国家的编码都有对应关系,1990开始研究的 1994年才开始正式使用。
所有的字符都是用2bytes来存储,英文用2bytes,中文也用2bytes。
内存
人类的字符---------unicode格式的数字----------
| |
| |
|
硬盘 |
|
| |
| |
GBK格式的二进制 Shift-JIS格式的二进制
老的字符编码都可以转换成unicode,但是不能通过unicode互转
中文字符、英文字符————————————》unicode二进制数——————————》gbk二进制
日文字符、英文字符————————————》unicode二进制数——————————》shiftJIS二进制
韩文字符、英文字符————————————》unicode二进制数——————————》Eu-kr二进制
万国字符————————————》unicode二进制————————————》utf-8二进制数
4、utf-8
1Byte 对应 英文字符
3Byte 对应 一个中文字符
群雄割据:
英文字符————————————内存:ASCII二进制数————————————》硬盘:ASCII二进制数
中文英文字符————————————内存:GBK二进制数————————————》硬盘:GBK二进制数
日文英文字符————————————内存:shiftJIS二进制数————————————》硬盘:shiftJIS二进制数
韩文英文字符————————————内存:Euc-Kr二进制数————————————》硬盘:Euc-Kr二进制数
过渡阶段:
中文英文字符————————————内存:unicode—————GBK———————》硬盘:GBK二进制数
日文英文字符————————————内存:unicode—————shiftJIS———————》硬盘:shiftJIS二进制数
韩文英文字符————————————内存:unicode—————Euc-Kr———————》硬盘:Euc-Kr二进制数
万国字符———————————————内存:unicode—————utf-8———————》硬盘:utf-8二进制数
内存固定使用:unicode
我们可以改变的是从内存写入硬盘时采用的编码格式
分久必合
万国字符———————————————内存:unicode—————utf-8———————》硬盘:utf-8二进制数
万国字符———————————————内存:utf-8———————————————————》硬盘:utf-8二进制数
5、乱码问题
1、存的时候乱了:采用的字符编码表无法识别输入的字符
存的时候就已经乱了,是无法补救的,取得时候一定也乱了
解决方法:存入硬盘的编码格式应该用utf-8格式
2、存的时候没有乱码:采用的字符编码表可以识别输入的字符
但是取得时候乱码了:采用的字符编码表与当初存的时候用的不是同一张表
解决方法:存的时候用什么编码取得时候就一定要用同样的编码格式
6、与运行pyhton程序有关的乱码问题
1、保证运行python程序的前两个阶段不乱吗
在python文件的开头加一行:
#coding: 文件存的时候用的编码格式如: #coding:GBK
2、保证第三个阶段不乱吗
使用python3
如果使用的是python2,应该在字符串前加前缀u 如x=u’上’
6、编码解码:
字符——————编码——————》unicode格式的数字——————编码——————》gbk格式的数字
字符——————解码——————》unicode格式的数字《——————解码——————gbk格式的数字