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

    一:字符编码知识储备

    1.程序运行与三大核心硬件的关系

    2.程序运行过程中产生的数据最先放在内存中

    3.python程序运行的三个步骤

    ​ python3 D:a.py

    ​ 1.先启动python解释器

    ​ 2.解释器会将a.py的内容当成普通内容从硬盘读入内存,此时没有语法意义

    ​ 3.解释器会解释执行刚刚读入内存的内容,开始识别python语法

    二:什么是字符编码

    字符------------------(标准)------------------- 数字
    
    ​					   gbk
    
    ​					  utf-8
    

    字符编码表:存放的是字符与数字的对应关系

    1.ASCII: 只能识别英文字符

    ​ 特点: 采用9bit对应一个英文字符

    ​ 8bit = 1byte

    2、GBK:可以识别中文字符串与英文字符
    特点:采用16bit对应字符,该字符可以是英文字符、也可以是中文字符

    3、shift-JIS: 可以识别日文和英文

    4、unicode:可以识别万国字符
    特点:2Bytes对应一个字符

    字符-----》unicode格式的数字
    |
    GBK shiftJIS

    中文字符、英文字符------------》unicode二进制数-----------》gbk二进制数
    日文字符、英文字符------------》unicode二进制数-----------》shiftJIS二进制数
    韩文字符、英文字符------------》unicode二进制数-----------》Euc-kr二进制数
    万国字符------------》unicode二进制数-----------》utf-8二进制数

    5、为什么不直接用utf-8
    1Byte对应英文字符
    3Byte对应一个中文字符

    utf-8是针对Unicode的可变长度字符编码:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储
    
    unicode更像是一个过渡版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,等过去几十年,所有老编码的文件都淘汰掉之后,会出现一个令人开心的场景,即硬盘里放的都是utf-8格式,此时unicode便可以退出历史舞台,内存里也改用utf-8,天下重新归于统一
    

    三.字符编码发展史

    1、群雄割据:
    英文字符--------------内存:ASCII二进制数--------------->硬盘:ASCII二进制数
    中文英文字符--------------内存:GBK二进制数--------------->硬盘:GBK二进制数
    日文英文字符--------------内存:shiftJIS二进制数--------------->硬盘:shiftJIS二进制数
    韩文英文字符--------------内存:Euc-Kr二进制数--------------->硬盘:Euc-Kr二进制数

    2、过渡阶段:
    中文英文字符------------内存:unicode=gbk>硬盘:GBK二进制数
    日文英文字符------------内存:unicode
    =shifJIS>硬盘:shiftJIS二进制数
    韩文英文字符------------内存:unicode
    =Euc-Kr=>硬盘:Euc-Kr二进制数
    万国字符----------------内存:unicode
    =utf-8======>硬盘:utf-8二进制数

    内存固定使用:unicode
    我们可以改变的是从内存写入硬盘采用的编码格式

    3、分久必合:
    万国字符----------------内存:unicode=utf-8>硬盘:utf-8二进制数
    万国字符----------------内存:utf-8
    ========================>硬盘:utf-8二进制数

    乱码问题:
    1、存的时候乱了:采用的字符编码表无法识别输入的字符
    存的时候就已经乱了,是无法补救的,取的时候一定也乱了

       解决方法:存入硬盘的编码格式应该用utf-8格式
    

    2、存的时候没有乱码:采用的字符编码表可以识别输入的字符

    ​ 但是取的时候乱码了:采用的字符编码表与当初存的时候用的不是同一张表

    解决方法:存的时候用什么编码,取的时候一定要用同样的编码格式
    

    与运行python程序有关的乱码问题:
    1、保证运行python程序的前两个阶段不乱码
    在python文件的开头加一行:
    #coding:文件存的时候用的编码格式

    2、保证第三个阶段不乱码

    ​ 使用python3

    ​ 如果使用的是Python2,应该在字符串前加前缀u

    """

    编码:

    字符------编码------>Unicode格式的数字-----编码----->gbk格式的数字

    字符------编码------->Unicode格式的数字-----解码-------gbk格式的数字

    在python3中字符串类型的值在内存中都是unicode格式的数字
    x="上"
    print(x)
    在python2中字符串类型的值在内存中都是文件头指定编码格式的数字
    x=u"上" # 如果在字符串前加前缀u就把字符串强制存成unicode格式,推荐使用
    print([x,])
    print(x)

    x = "上"

    编码与解码

    Unicode格式的数字编码=>其他编码格式的数字

    res1 = x.encode("gbk")

    print(res1,type(res1))

    res2 = x.encode('utf-8')

    print(res2,type(res2))

    bytes类型可以理解为一种硬盘的原生格式

    str类型

    其他编码格式的数字=解码=>Unicode格式数字

    x = res1.decode('gbk')

    print(x)

    y = res2.decode('utf-8')

    print(y,type(y))

  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/lgh8023/p/13307187.html
Copyright © 2011-2022 走看看