16.字符编码

1.储备知识点

  • 三大核心硬件:cpu、内存、硬盘
1.软甲在运行前,软件的代码及其相关数据都是存放在硬盘中的
2.任何软件的启动都是将数据从硬盘读入内存,然后cpu从内存中取出指令并执行的
3.软件运行过程中产生的数据最先都是存放在内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘

2.字符编码发展史

  • ASCII表:
1.只有英文字符与数字一一对应
2.一个英文字符对应1Bytes,1Bytes=8bit,8bit包含256个数字,可以对应256个字符,足够表示所有英文字符
  • GBK
1.只有中文字符、英文字符与数字的一一对应关系
2.一个英文字符对应1Bytes
  一个中文字符对应2Bytes
  1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
  2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
  • shift_jis、Eur_kr
shift_jis:只有日文字符、英文字符与数字的一一对应关系
Eur_kr:只有韩文字符、英文字符与数字的一一对应关系

3.编码与解码

  • 编码
由字符转换成内存中的unicode,以及内存中的unicode转换成其他编码的过程,都称为编码encode
  • 解码
由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode

4.字符编码的应用

目的:为了存取字符时不发生乱码问题

  • 内存中固定使用unicode,无论输入任何字符都不会发生乱码
  • 我们能够修改的是存取硬盘的编码方式,如果编码设置不正确将会出现乱码问题。乱码问题分为两种,村乱了,读乱了
  • 存乱了:如果用户输入的额内容中包含中文和日文字符,如果单纯以shift_jis存,日文可以正常写入硬盘,而中文由于中文字符在shift_jis中没有找到对应关系导致讯乱了
  • 读乱了:如果硬盘中的数据是shift_jis格式存储的,采用GBK格式读入内存就读乱了

总结:

  • 保证存的时候不乱:在由内存写入硬盘时,必须将硬盘格式设置为支持所输入字符的编码格式
  • 保证读的时候不乱:在由硬盘读入内存时,必须采用与写入硬盘时相同的编码格式

5.python解释器执行文件的前两个阶段

  • 文本编辑器读取文件内容的流程
#阶段1、启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)

#阶段2、文件编辑器会将文件内容从硬盘读入内存

#阶段3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上
  • python解释器执行文件的流程
#阶段1、启动python解释器,此时就相当于启动了一个文本编辑器

#阶段2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中

#阶段3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法

执行py文件的前两个阶段就是python解释器读文本文件的过程,与文本编辑读文本文件的前两个阶段没人任何区别,要保证读不乱码,则必须将python解释器读文件时采用的编码方式设置为文件当初写入硬盘时的编码格式,如果没有设置,python解释器则才用默认的编码方式,在python3中默认为utf-8,在python2中默认为ASCII,我们可以通过指定文件头来修改默认的编码。

  • 在文件首行写入包含#号在内的以下内容
# coding: 当初文件写入硬盘时采用的编码格式

解释器会先用默认的编码方式读取文件的首行内容,由于首行是纯英文组成,而任何编码方式都可以识别英文字符。

在Python3中,字符串类的值都是使用unicode格式来存储

python2后推出了一种补救措施,就是在字符串类型前加u,则会将字符串类型强制存储unicode,这就与python3保持一致了,对于unicode格式无论丢给任何终端进行打印,都可以直接对应字符不会出现乱码问题

# coding:utf-8
x = u'上' # 即便文件头为utf-8,x的值依然存成unicode

6.编码与解码的使用

# 1、unicode格式------编码encode-------->其它编码格式
>>> x='上' # 在python3在'上'被存成unicode
>>> res=x.encode('utf-8')
>>> res,type(res) # unicode编码成了utf-8格式,而编码的结果为bytes类型,可以当作直接当作二进制去使用
(b'xe4xb8x8a', <class 'bytes'>)

# 2、其它编码格式------解码decode-------->unicode格式
>>> res.decode('utf-8') 
'上'
原文地址:https://www.cnblogs.com/Psc-mmf/p/13915667.html