字符编码

一、基础知识

应用程序任何操作硬件的请求都需要向操作系统发起系统调用,然后由操作系统去操作硬件。

二、文本编辑器存取文件的原理

1、打开编辑器就启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放在内存中,断电后数据丢失。

2、想要永久保存就需要点击保存按钮,编辑器把内存的数据刷到硬盘上。

三、python解释器执行py文件的原理,例如python

#第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器

#第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中(小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名)

#第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码( ps:在该阶段,即真正执行代码时,才会识别python的语法,执行文件内代码,当执行到name="egon"时,会开辟内存空间存放字符串"egon")

四、总结python解释器与文本文件编辑的异同

#1、相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样

#2、不同点:文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法。

字符编码介绍

一、什么是字符编码

字符-------(翻译)------数字

定义:这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码。

二、编码种类介绍

ASCII使用一个字节代表一个字符

Unicode常用两个字节代表一个字符,生僻字用四个字节,兼容所有的编码

UTF-8可变长编码

三、总结字符编码的发展

#阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII

ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符

ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符),后来为了将拉丁文也编码进了ASCII表,将最高位也占用了

#阶段二:为了满足中文和英文,中国人定制了GBK

GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符

为了满足其他国家,各个国家纷纷定制了自己的编码

日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里

#阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。如何解决这个问题呢???

#!!!!!!!!!!!!非常重要!!!!!!!!!!!!

说白了乱码问题的本质就是不统一,如果我们能统一全世界,规定全世界只能使用一种文字符号,然后统一使用一种编码,那么乱码问题将不复存在,

ps:就像当年秦始皇统一中国一样,书同文车同轨,所有的麻烦事全部解决

很明显,上述的假设是不可能成立的。很多地方或老的系统、应用软件仍会采用各种各样的编码,这是历史遗留问题。于是我们必须找出一种解决方案或者说编码方案,需要同时满足:

#1、能够兼容万国字符

#2、与全世界所有的字符编码都有映射关系,这样就可以转换成任意国家的字符编码

这就是unicode(定长), 统一用2Bytes代表一个字符, 虽然2**16-1=65535,但unicode却可以存放100w+个字符,因为unicode存放了与其他编码的映射关系,准确地说unicode并不是一种严格意义上的字符编码表,下载pdf来查看unicode的详情:

链接:https://pan.baidu.com/s/1dEV3RYp

很明显对于通篇都是英文的文本来说,unicode的式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)

于是产生了UTF-8(可变长,全称Unicode Transformation Format),对英文字符只用1Bytes表示,对中文字符用3Bytes,对其他生僻字用更多的Bytes去存

#总结:内存中统一采用unicode,浪费空间来换取可以转换成任意编码(不乱码),硬盘可以采用各种编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。

!!!重点!!!

总结

内存中的编码固定使用Unicode

Unicode--->encode----->utf-8

utf-8----->decode----->unicode