• Python文本和字节序列


    ASCII码

    早期人们用8位二进制来编码英文字母(最前面的一位是0)

    也就是说,将英文字母和一些常用的字符和这128种二进制0、1串一一对应起来,

    比如:大写字母“A”所对应的二进制位“01000001”,转换为十六进制为41。

    在美国,这128是够了,但是其他国家不够,他们的字符和英文是有出入的,

    比如:在法语中在字母上有注音符号,如 é 。

    所以各个国家就决定把字节中最前面未使用的那一个位拿来使用,原来的128种状态就变成了256种状态,

    比如:é就被编码成130(二进制的10000010)。

    为了保持与ASCII码的兼容性,一般最高位为0时和原来的ASCII码相同,最高位为1的时候,各个国家自己给后面的位(1xxx xxxx)赋予他们国家的字符意义。

    这就成了不同国家有不同国家的编码方式,所以如果给你一串二进制数,想要解码,就必须知道它的编码方式,不然就会出现我们有时候看到的乱码 。

    Unicode码

    Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制)

    每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制,在前面加上U+。

    例如:“马”的Unicode是U+9A6C。

    Unicode就相当于一张表,建立了字符与编号之间的联系

    它是一种规定,Unicode本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。

    同时转换为二进制形式的存储方法可以有:UTF-8、UTF-16、UTF-32

    UTF-8

    UTF-8就是使用变长字节表示,就是使用的字节数可变,

    这个变化是根据 Unicode 编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多。使用的字节个数从1到4个不等。

    编码规则:

    ① 对于单字节的符号,字节的第一位设为0,后面的7位为这个符号的Unicode码,因此对于英文字母,UTF-8编码和ASCII码是相同的。 

    ② 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,剩下的没有提及的二进制位,全部为这个符号的Unicode码 。

    例子:

    “马”的Unicode编号是:0x9A6C,整数编号是39532,对应的二进制是 1001 1010 0110 1100,

    将二进制填入就为: 11101001 10101001 10101100 。

    所以,马的字节序列为:b'xe9xa9xac'

    UTF-16

    UTF-16使用变长字节表示 

    ① 对于编号在U+0000到U+FFFF的字符(常用字符集),直接用两个字节表示。 

    ② 编号在 U+10000到U+10FFFF之间的字符,需要用四个字节表示。

    UTF-16 也有字节的顺序问题(大小端),所以就有UTF-16BE表示大端,UTF-16LE表示小端。

    UTF-32 

    这个就是字符所对应编号的整数二进制形式,四个字节,这个就是直接转换。

    比如:马的Unicode为:U+9A6C,那么直接转化为二进制,它的表示就为:1001 1010 0110 1100。

    计算机在存储器中排列字节有两种方式:大端法和小端法,大端法就是将高位字节放到底地址处,比如0x1234, 计算机用两个字节存储,一个是高位字节0x12,一个是低位字节0x34,

    UTF-32用四个字节表示,处理单元为四个字节(一次拿到四个字节进行处理),如果不分大小端的话,那么就会出现解读错误

    我们可以根据他们高低字节的存储位置来判断他们所代表的含义,所以在编码方式中有 UTF-32BE 和 UTF-32LE ,分别对应大端和小端,来正确地解释多个字节(这里是四个字节)的含义。

    字符问题补充

    一个字符串 是一个字符序列

    在2015年,字符最佳定义是Unicode字符。

    因此Python3的str对象中获取的元素是Unicode字符,相当于Python2的unicode对象中获取的元素。

    Unicode标准字符的标识 具体的字节表述 进行明确区分:

    (1)字符的标识(码位):以4~6个十六进制数字表示,(字母A码位是U+0041)

    (2)字节表述:取决于所用的编码。在UTF-8编码中,A(U+0084)码位编码成单个字符x41

    二进制序列类型bytes或bytesarray对象的各个元素都是介于0~255之间的整数。

    bytes对象的切片还是bytes对象,bytesarray对象的切片还是bytesarray对象。

    s[0] == s[:1] 只对str类型成立。

  • 相关阅读:
    ES6学习之装饰器
    ES6学习之Class
    ES6学习之Async函数
    ES6学习之Generator函数
    for循环及break和continue的区别
    ES6学习之Iterator和For...of循环
    js检测对象属性
    ES6学习之Promise
    ES6学习之Reflect
    Visual Studio references中的package找不到
  • 原文地址:https://www.cnblogs.com/5poi/p/11150702.html
Copyright © 2020-2023  润新知