字符编码

字符编码

一:发展过程

仅与字符串有关,图像视频音频和字符编码没有任何关系

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开的的文件,改一下编码即可.

看十遍不如自己写一遍!巩固基础,纵横开拓!
原文地址:https://www.cnblogs.com/gyxpy/p/13431081.html