简明字符编码

发布时间:2019-10-09 10:39:58编辑:auto阅读(1753)

    原文来源 https://www.jmjc.tech/tutoria...

    我们在显示屏上看的字母a、b、c...最终都会被转换成0/1序列, 因为计算机只能识别0和1。从数字到字母的转换都过程,计算机需要依赖于一个类似于字典的东西,它是权威标准的,每一台计算机都要按照它都规定,最早诞生的字典,名为ASCII


    ASCII

    一个字节(byte)是8位的二进制0000 0000,总共代表256种状态。最初的计算机只流行于英语国家,英文的字母大小写总共是52个,加上一些常用的符号,数字,这个字典的长度是128位,所以ASCII占用一个字节

    【 ASCII对照表 】


    后来,计算机发展到了世界各地,只表示英文和数字的ASCII已经满足不了各国的需求,大家纷纷发展出自己语言的字典,比如中国的GBK。 这样很有问题,夹杂着各种语言的文档,经常会被解析出来一大堆 乱码。为了统一,大家商议决定,制定一个通用的字典unicode


    unicode

    unicode是在ASCII的基础上扩展的,对原有ASCII字符完全兼容。长度上从原来的0000 0000,扩展到了0000 0000 0000 0000,占用2个字节,可以容纳65535个字符。

    # ASCII 字母 A
    0110 0001 # 十进制 = 97
    
    # unicode 字母 A 
    0000 0000 0110 0001 # 十进制 = 97 | ASCII字符就在前面补8位的0

    UTF-8

    unicode是一个字典,也叫字符集,是信源编码。而UTF-8是信道编码,我们数据在传输的时候,都会被解析成UTF-8。

    UTF-8是在unicode的基础上,进行编码和解码,针对unicode传输实现的编码还有UTF-16 / UTF-32等...

    UTF-8是变长的,不同的文字有不同的长度,英文字母一般是1 byte,汉字是3 byte。


    Python 的字符编码

    Python3之前的Python版本,使用的是ASCII编码,所以对中文的支持很头,现在已经原生的支持unicode

    # 正 unicode
    >>> ord('a')
    97
    
    # 反 unicode
    >>> chr(97)
    'a'
    
    # 中文
    >>> ord('哦')
    21734

    编码解码

     # 编码
    >>> 'a'.encode('utf-8')
    b'a'
    
    >>> '哦'.encode('utf-8')
    b'\xe5\x93\xa6'
    
    # 解码
    >>> b'\xe5\x93\xa6'.decode('utf-8')
    '哦'

    byte

    二进制数据类型,1 byte是8位的二进制0000 0000。

    >>> len('哦') # 1个字符
    1
    
    >>> len('哦'.encode('utf-8')) # 3个字节
    3
    
    # 以上是字节和字符的关系

关键字