Python中的字符编码

知识储备

2.1三大核心硬件

# cpu、内存、硬盘是计算机的三大核心硬件。
# 1.任何软件在运行之前,都是以二进制的格式储存在硬盘当中的。
# 2.当软件被打开时,硬盘将数据加载到内存中,cpu再从内存中读取数据被执行。
# 3.软件在运行过程中产生的数据都是存放于内存中,若想永久保存数据,则得转移到硬盘中

# 有的小伙伴可能会想到:那在电脑开机时,内存中是没有数据的,操作系统的数据也存在于硬盘。
# CPU自然没法从内存中读取数据而完成的开机操作?
# 实际上,cpu的设计使得每次CPU启动时,它的程序计数器都从实现确定的特定地址开始。
# CPU就期望在这个地址上找到程序要执行的第一条指令。计算机的一小部分内存就用特殊的非易失性技术制造的(一小部分硬盘)
# 这一小部分,就是CPU期望找到的初始程序。

2.2文本编辑器读取文件内容的流程

# 打开一个文件编辑器,nodepad++,
# 文本编辑器从硬盘中加载数据到内存。
# 文本编辑器将其加载的内容显示在屏幕上

2.3python解释器执行文件的流程

# 启动python解释器,相当于启动了一个文本编辑器。
# python解释器将硬盘上test.py的数据加载到内存中
# python解释器刚读入到内存中的内容,识别python语法并执行。

2.4总结

# 相同点,前两个阶段二者是一样的,都是从硬盘中加载数据。
# 不同点:在阶段3时,对数据的处理方式不一样
#        1.解释器根据python语法去解释执行代码
#        2.文本编辑器直接将内容显示在屏幕上

字符编码的由来:


字符是表示人类语言的基本单位。

如英文字母、中文汉字、日文等都有自己的字符体系。

而计算机是基于电路,0和1是计算机语言的基本单位。

想要将人类语言数据存储在计算机中就必须找到一种对应关系。

如用 0110 0001 表示字母a, 0110 0010 表示字母b。

1个比特(bit)就表示1位。8个比特则是2**8总共可以表示256个字符。

对于计算机的发源地美国,8个bit的编码表足够表示常用的字符。这就是最早应用的ASCII表。



计算机经过几十年的飞速发展,已被广泛的应用于各个国家。问题来了,以中文为例,

没有一种编码表能作为汉字和二进制字节的转换,我国就指定了GBK编码标准。其他国家也一样,

如日本有shift-JIS、韩国有EUC-KR。

这样一来,各国本身的编码问题就解决了。但是更大的问题就来了,随着世界变成地球村,各国的文件都有可能在其他国家被应用。但由于编码方式的不同,在硬盘里 0000 1111,在GBK里可能表示‘啊‘

在ASCII里可能表示一个符号’!‘。这就导致了乱码的发生。

怎么办呢?

后来就产生了 计算机科学领域里的一项业界标准 ,Unicode(万国码),Unicode由2个字节来表示一个字符。这样Unicode就能表示2*16=65536个字符,足以表示全球所有国家的字符。

但对于英文来说:

1.数据在硬盘中的占用空间变大了

2.I/0次数翻了一倍(最致命的问题)



所以Unicode被广泛应用于内存中。但从内存将数据存储到硬盘的过程当中,又会经过一次编码,以尽可能少的减轻上面两个问题。

从内存到硬盘的存储过程中,可指定编码格式。

相应地,文件执行时,从硬盘加载数据到内存中需要按照存储的编码格式来打开才可保证不乱码。
原文地址:https://www.cnblogs.com/Ghostant/p/11811889.html