• 字符编码


    字符编码

    一:发展过程

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

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

    看十遍不如自己写一遍!巩固基础,纵横开拓!
  • 相关阅读:
    关于跳板机登陆服务器一系列操作命令
    Linux环境搭建docker-selenium来运行UI自动化
    linux环境升级python2.7到python最新版本
    守护进程的理解--性能
    macbook添加webdriver驱动注意事项
    windows压测机本地端口号配置
    jmeter的bean shell 如何写数据到文件中
    Jenkins Pipeline介绍
    Jenkins创建Maven Job
    配置 Maven 项目使用 Nexus 仓库
  • 原文地址:https://www.cnblogs.com/gyxpy/p/13431081.html
Copyright © 2020-2023  润新知