(三)python之字符编码

一、引言


1,计算机基础知识

(三)python之字符编码

2,文本编辑器存取文件的原理(nodepad++,pycharm,word)

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

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

# 3、在我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已。

3,python 的解释器执行.py文件的原理,例如 python test.py

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

第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中
        (小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名)
        
第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码
        ( ps:在该阶段,即真正执行代码时,才会识别python的语法,执行文件内代码,当执行到name="zixi"时,会开辟内存空间存放字符串"zixi")
"""

4,总结 python 解释器与文本编辑器的区别:

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

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

二、字符编码介绍


1,什么是字符编码?

计算机要想工作必须通电,即用‘电’驱使计算机干活,也就是说‘电’的特性决定了计算机的特性。
电的特性即高低电平(人类从逻辑上将二进制数1对应高电平,二进制数0对应低电平),关于磁盘的
磁特性也是同样的道理。结论:计算机只认识数字

很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也
无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?

必须经过一个过程:
# 字符--------(翻译过程)------->数字 

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

2,以下两个场景下涉及到字符编码的问题:

# 1,一个python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(python文件并未执行,前两个阶段均属于该范畴)

# 2,python中的数据类型字符串是由一串字符组成的(python文件执行时,即第三个阶段)

3,总结字符编码的发展可分为三个阶段(重要)

# 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的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,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。

重要

(三)python之字符编码

基于目前的现状,内存中的编码固定就是 unicode,我们唯一可变的就是硬盘的上对应的字符编码。
此时你可能会觉得,那如果我们以后开发软时统一都用 unicode编码,那么不就都统一了吗,关于统一这一点你的思路是没错的,但我们不可能使用 unicode编码来编写程序的文件,因为在通篇都是英文的情况下,耗费的空间几乎会多出一倍,这样在软件读入内存或写入磁盘时,都会徒增IO次数,从而降低程序的执行效率。因而我们以后在编写程序的文件时应该统一使用一个更为精准的字符编码 utf-8(用1Bytes存英文,3Bytes存中文),再次强调,内存中的编码固定使用 unicode。

1)在存入磁盘时,需要将 unicode转成一种更为精准的格式,utf-8:全称Unicode Transformation Format,将数据量控制到最精简

2)在读入内存时,需要将 utf-8转成unicode
所以我们需要明确:内存中用 unicode是为了兼容万国软件,即便是硬盘中有各国编码编写的软件,unicode也有相对应的映射关系,但在现在的开发中,程序员普遍使用 utf-8编码了,估计在将来的某一天等所有老的软件都淘汰掉了情况下,就可以变成:内存utf-8<->硬盘utf-8的形式了。

3)总结非常重要的两点:

# 1,保证不乱吗的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码

# 2,在内存中写的所有字符,一视同仁,都是unicode编码,比如我们打开编辑器,输入一个“你”,我们并不能说“你”就是一个汉字,
# 此时它仅仅只是一个符号,该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往
# 硬盘保存或者基于网络传输时,才能确定”你“到底是一个汉字,还是一个日本字,这就是unicode转换成其他编码格式的过程了

(三)python之字符编码

# 补充:
# 浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器。

# 如果服务端encode的编码格式是utf-8, 客户端内存中收到的也是utf-8编码的结果。
 
(三)python之字符编码
 
 
 
(三)python之字符编码
 
 
 
(三)python之字符编码
 
 
 
(三)python之字符编码
 
 

相关推荐