字符编码
一:发展过程
仅与字符串有关,图像视频音频和字符编码没有任何关系
str无法传输和保存必须转为二进制
1.ASCII编码
只认识因为8字节,28
2.gbk编码
认识中文 数字 英文 特殊符号等,这是国标,而非过激标准
3.unicode编码
所有的字符全部囊括在内
所有字符都用4byte表示,太费资源,网络发送费流量,磁盘存储费空间,而且IO压力更大.
4.utf-8
在unicode的基础上进行了升级
1byte表示英文
2byte表示欧洲国家文字
3byte表示中文
4byte表示生僻的字,古希腊,古埃及
二:编码
类似一个密码本,上面是01与文字的映射关系,可以相互转换.
ASCII编码本里面没有中文日文的对应关系
规定:
1.不同密码本之间不能相互识别,会乱码,编码解码必须一致.
2.内存中的数据全部以unicode编码,虽占用内存,但它大而全,兼容所有文字,且内存不值钱.
3.data用于网络传输或者存放到硬盘,必须是非unicode编码
4.unicode编码有与所有编码本互转的映射关系.
三:python中的数据类型
python3中所有的数据类型都是以unicode编码的形式存放在内存里面.
只有bytes数据类型除外,他可以直接传输和存于disk.
注意:
byte和bytes是两码事
byte是字节
bytes是python的数据类型,叫做字节文本,python中所有的数据类型想要保存或者传送必须转为bytes类型,编码大部分为utf-8
它和str是孪生兄弟,大部分都相同,但是总有一点不同
互转: str----->bytes encode("utf8")
bytes--->str decode("utf8")
例如表现形式:
处理英文时的表现形式: msg1="hello" msg2 = b"hello"
但是处理中文大不相同
str表现形式msg 1= "中国"
bytes表现形式:msg2 = b"中国" 立马报错!SyntaxError: bytes can only contain ASCII literal characters.
bytes数据类型只能含有ASCII字符
msg="中国"
msg.encode("utf-8")---> b'xe4xb8xadxe5x9bxbd'才不会报错
因此之所分str和bytes类型是因为二者在处理中文的不同是原因之一.
前者是为了人看的,后者是为了电脑看的.
二者的内置方法几乎无异,但是bytes的方法很少用,大部分都是str的内置方法处理字符串之后,再encode为bytes类型.
四:编辑过程
键盘输入文字中间发生了什么?
1.键盘打字后的内容被unicode编码到内存中. 键盘---->内存 文字------>01
2.ctrl+s文字从uncideo编码转为编辑器指定的编码存放于内存中.
3.显示器中看到的数据都是存在于内存里面的. 内存到屏幕 01----->文字
os来链接不同硬件相互合作.
打开文件发生了什么?
1.os按照文件的编码方式,解码为unicode到内存中
2.再输入一些内容之后,将uncode编码转为指定编码存入内存中.
python解释器的工作过程
1.python解释器启动,开启进程
2.python解释器从硬盘里面找到.py文件,将他加载到内存中,此时的py文件就是一个纯文本文件,按照对应编码方式,解码到内存中,就是一个纯文本
前两个阶段涉及一个读文本的字符编码问题,例如vscode右下角的编码指的是py文件的编码方式,服务于前两个阶段.
一旦你非要用其他编码写py源码,那么python解释器立马报错,因为python3解释器默认用utf8
为了不墨迹,别给自己找麻烦,都用utf-8
非要用gbk,则加文件头
#coding:gbk 告诉编辑器以gbk的方式读取python源码,管的是读,右下角的utf8是管的保存到硬盘的编码方式.
python3解释器默认以utf8编码读入字符文件,coding:gbk表示pythoen源代码以gbk存入硬盘的,解释器用gbk来读取,否则报错
3.python解释器开始解析读入内存中的字符串,它可以进行python代码的语法识别,这里还会涉及一个字符编码,
此时文件已经加载到内存,开始识别python语法
例如msg="中国"此时发生变量赋值,申请内存,此时都是unicode编码
解释器要向内存申请空间来存放中国二字,python3解释器默认用unicode存放此中国二字,只是现在都是unicode存放,可以无视.
注意:这个和py文件里面的中国文字是有区别的,py文件中的中国二字是纯文本
而在内存里面申请的空间存放的中国二字,是有type id value的,type是str,id是内存地址,value是中国
总结:python源码不乱码
五:gbk如何转为utf8?
所有的编码都与unicode编码有关
msg.encode("gbk")
1:b'xd6xd0xb9xfa'
msg.encode("utf8")
2:b'xe4xb8xadxe5x9bxbd'
===============1如何转为2呢?=======================
msg1=b'xd6xd0xb9xfa'
msg2=b'xe4xb8xadxe5x9bxbd'
msg = msg1.decode("gbk") # 按gbk解码转为unicode
ret = msg.encode("utf-8") # 按utf8编码
print(ret == msg2) # True
六:编码解码
str到bytes就不说了
unicode编码到其他编码叫做编码
其他编码到unicode编码叫解码
七:如何保证不乱码
存乱了,取乱了
1.取乱了
存到硬盘为gbk,取时用shift-jis取,也会乱码,
此时数据可以恢复!换为存是编码即可.-----编码解码相同
2.存乱了
此时是非常致命的,是无法恢复的,一旦是重要数据,损失太大.
shift-jis编码,输入此内容
此时不会乱码,因为实在内存里面,是unicode它认识所有的文字
此时保存关闭,会保存为shift-jis,但是此编码不认识中文,那么就只能乱存,造成乱码
因此以后保存都用utf8格式,可以将乱码避免.
可能使用windows系统,打开文件乱码,是因为windows默认用的gbk开的的文件,改一下编码即可.