字符编码
一、引入
字符串类型、文本文件的内容都是由字符组成的,但凡涉及到字符的存取,都需要考虑字符编码的问题。
字符编码这个知识点的典型特征就是理论多、结论少,但对于开发而言只需要记住结论即可,下面让我们来一点点介绍它
二、知识储备
2.1 三大核心硬件
所有软件都是运行硬件之上的,与运行软件相关的三大核心硬件为cpu、内存、硬盘,我们需要明确三点
#1、软件运行前,软件的代码及其相关数据都是存放于硬盘中的
#2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行
#3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘
三、字符编码介绍
字符编码只跟文本文件和字符串有关,跟音频文件,视频文件之类的都没有关系
字符编码:记录了人类语言与数据之间的对应关系
3.1 什么是字符编码?
计算机内部只认识二进制,但是,我们人类语言有各种各样的样式,为了让计算机能够认识人类的语言,内部有一种机制就是讲人类语言转为计算机语言
3.2 字符编码表的发展史 (了解)
字符编码的发展经历了三个重要的阶段,如下
3.2.1 阶段一:一家独大
现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表
'''
ASCII表的特点:
1、只有英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes,1Bytes=8bit,所有字符加起来一共有127个字符,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
'''
记忆:
A-Z:65-90
a-z:97-122
0-9:48-57
小写字母对应的数字一定大于大写字母
3.2.2 阶段二:诸侯割据、天下大乱
为了让计算机能够识别中文和英文,中国人定制了GBK
'''
GBK表的特点:
1、只有中文字符、英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes
一个中文字符对应2Bytes或者3Bytes
补充说明:
1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
'''
每个国家都各自的字符,为让计算机能够识别自己国家的字符外加英文字符,各个国家都制定了自己的字符编码表
'''
日本:Shift_JIS表的特点:
1、只有日文字符、英文字符与数字的一一对应关系
韩国:Euc-kr表的特点:
1、只有韩文字符、英文字符与数字的一一对应关系
'''
3.2.3 阶段三:分久必合
1.unicode表(万国码): 存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符
# 使用至少2个字节保存数据
# 结论:unicode码只在内存中起作用
# eg:\u4e00-\u4ef0
2.utf8编码
由于unicode固定使用两个字节来存储一个字符,如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可),然而空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
'''
想要保存在硬盘中要转成utf8编码
我们日常使用的字符编码都是utf8编码,但是,utf系列还有utf16,utf32... utf8mb4
# 使用
一个字节保存一个英文字符
中文字符使用三个字节保存
补充:utf8只能存储正常的字符,utf8mb4可以存储表情
'''
# utf8用3个字节保存中文字符
s = '你好'
print(s.encode('utf8'))
# 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd'
# gbk用2个字节保存中文字符
s = '你好'
print(s.encode('gbk'))
# 输出:b'\xc4\xe3\xba\xc3'
3.3 字符编码的使用
3.3.1 如何解决乱码问题?
文本文件使用什么字符编码保存,打开的时候就要使用对应的字符编码
3.3.2 python解释器版本不同带来的差异
python2 解释器使用的字符编码还是ASCII表
python3 使用的是utf8编码
3.3.3 添加文件模板
settings
Editor
File and code template
python script
python2.x版本,不能识别中文。想要识别中文,要utf8编码,需要在模板上添加# coding:utf8,或者# -- coding:utf8 --
3.3.4 编码与解码(核心)
编码:
将人类能够读懂的语言转为计算机能够读懂的语言
解码:
将计算机能够读懂的语言转为人类能够读懂的语言
4.1 使用1:
ss = '趁年轻,学技能,养活自己'
# 编码:encode()
print(ss.encode('gbk'))
# bytes 字节,看成是二进制
s1 = ss.encode('utf8')
print(s1)
print(type(s1))
# 输出:b'\xb3\xc3\xc4\xea\xc7\xe1\xa3\xac\xd1\xa7\xbc\xbc\xc4\xdc\xa3\xac\xd1\xf8\xbb\xee\xd7\xd4\xbc\xba'
# <class 'bytes'>
# 解码decode()
# 用什么方式编码就要用什么方式解码
print(s1.decode('utf8'))
# 输出:趁年轻,学技能,养活自己
4.2使用2:
只有英文字符和数字,要想编码的话,有两种方式
# 方式1:直接使用前缀b (二进制:binary)
# 用的是当前文件的默认编码格式
s = b'kevin123'
# 方式2:encode编码
s = 'kevin123'
# 用utf8编码格式
print(s.encode('utf8'))