zoukankan      html  css  js  c++  java
  • 字符编码

    字符编码

    一:发展过程

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

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

    看十遍不如自己写一遍!巩固基础,纵横开拓!
  • 相关阅读:
    解决UITableView中Cell重用机制导致内容出错的方法总结
    Hdu 1052 Tian Ji -- The Horse Racing
    Hdu 1009 FatMouse' Trade
    hdu 2037 今年暑假不AC
    hdu 1559 最大子矩阵
    hdu 1004 Let the Balloon Rise
    Hdu 1214 圆桌会议
    Hdu 1081 To The Max
    Hdu 2845 Beans
    Hdu 2955 Robberies 0/1背包
  • 原文地址:https://www.cnblogs.com/gyxpy/p/13431081.html
Copyright © 2011-2022 走看看