网站客服:zx81024163 |

深入解析Python字符编码与二进制数据处理:从ASCII到现代编码标准

2025-02-27 23:01:34发布    浏览218次    信息编号:217511

友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。

深入解析Python字符编码与二进制数据处理:从ASCII到现代编码标准

该系列主要介绍字符编码和其他问题的问题以及如何处理二进制数据。

我们都知道,计算机以二进制模式运行,所有信息最终都以二进制字节存储。每个字节包含8位。对于数字,将它们存储在二进制模式下很方便。例如,“ 5”可以存储为3位:0b101,这意味着整数15。那么,计算机如何存储字符?

特点

字符集

由于计算机可以轻松存储数字,因此人们已经想到将字符映射到数字中,然后将其转换为二进制存储。字符和数字的映射称为字符集。最常见的字符集是ASCII字符集。 ASCII字符将图128个字符(分为95个可打印字符和33个控制字符)设置为128个整数,0〜127。这包括26个英语字母和键盘上可以看到的各种符号,以及许多特殊字符,例如Tab字符\ t和line \ n。一旦地图变成整数,存储就很方便,因为整数可以直接以二进制形式存储。例如,ASCII代码表中字符“ P”的相应整数为112,表示为二进制,总计7位。

在此,我们可以使用内置函数(ORD和CHR)轻松获取与字符相对应的ASCII代码值,并通过整数获取相应的ASCII代码字符:

print(ord('p'))
# 112
print(chr(112))
# 'p'

使用ASCII字符集,我们可以存储和传输一些字符。应该在这里强调,将字符映射到整数中,将整数存储到二进制中是两个过程。我们称为以前的字符集映射,而后者称为编码()。但是,ASCII直接存储在与整数相对应的二进制中,似乎映射和编码是相同的过程。稍后我们将看到不同的存储方法。

ASCII代码中有两个缺点:

计算机通常将字节用作基本存储单元,即8位,而ASCII代码仅使用7位,导致1位浪费。

ASCII只能表示128个字符。世界上有成千上万个角色可以显示,并且仅有超过两千个中文简化角色。如何存储这些字符?

为了应对以上两个缺点,人们做出了一些改进。例如,使用ASCII代码的第八位,这可以添加128个字符。但这还远远不够,另一个新问题是人们提出了自己的扩展方法,而没有统一的标准。例如,一个人认为整数150代表“©”,而B则认为150根据他自己的标准代表“¥”。通过这种方式,文档中的所有位置A发送给B的“©”的所有位置都由B翻译为“¥”,从而导致歧义。

中间

文本字符集

对于第一个角色集的严重短缺,人们提出了一个多材料角色来满足需求。以汉字为例。我国最早的汉字是。它包含超过99.7%的常用汉字,其中包括拉丁字母,希腊字母,和其他字符。每个字符由位置代码(也是整数)表示,并存储在两个字节中。例如,字符“ i”的位置代码为4650,其二进制存储内容表示为十六进制。在这里,我们发现数字4650的二进制表示为0b10,这与上面存储的字节不一致。这也证实了我们前面提到的两个过程:映射和存储。

它是使用兼容的ASCII代码设计的,所有汉字都置于128后面。因此,拉丁字母的映射和使用ASCII代码的拉丁字母映射是完全一致的。

尽管涵盖了足够的字符,但仍然有一些不包括的字符。因此,将来有许多扩展,更受欢迎的是GBK,目前是最新的。其中包括被迫在我的国家大陆使用的最新角色,而在我的国家台湾,使用了Big5角色集,其中主要包含传统角色。

万

国家法典

实际上,在世界各地提出了适合自己的角色集,这些角色集几乎是不相容的(每个人都与ASCII兼容)。这导致了一个巨大的兼容性问题。在使用法语设置的某个字符的机器上打开映射的文章时,必须乱七八糟。因此,一些标准化组织已开始努力提出全球统一的角色集,以便可以将世界各个角色映射到标准的统一数字中。其中最著名的标准是。实际上,由于两者在很久以前被声明为兼容和常见的扩展,因此我们今天所指的统一角色集通常是指的。

它统一了世界各地不同角色的映射方法。拉丁字母,汉字,日语,韩语,法语,德语等都可以在映射表中找到与它们相对应的独特整数。这大大改善了不同语言国家之间字符的传播。只要每个人都遵循标准,所有字符都可以正确显示。

那怎么做呢?

将所有字符分为17架平面,每个平面中的每个字符均由4位十六位数的数字表示。也就是说,使用的整数范围为00000〜00〜0,第一个数字0〜10显示了0〜16平面,最后四位数字0000〜FFFF表示平面中的相应字符。如果转换为整数,字符范围为0〜。 0th的0平面称为基本平面(BMP)。我们目前使用的大多数字符,包括来自各个国家的角色,都涵盖在这架飞机上。值得一提的是,它也与ASCII字符集完全兼容。因此,0平面中的0〜127整数与ASCII字符集完全相同。

字符的表示以“ u+”开头,然后是与角色相对应的十六进制值。例如,字符“ a”表示为“ u+0061”(以整数为单位)为97,与ASCII一致,而字符“ i”表示为“ U+6211”,以Digit为25105。

角色集也不断包含新角色,例如表情符号表情符号不断加入家庭。目前,它已经输入了11.0.0版本,其中包括超过130,000个字符。

Uni

代码编码方法

正如我们以前一直强调的那样,映射和编码是两个过程。我们主要介绍的是字符集的映射方法,即如何将字符映射到整数中。让我们专注于计算机如何存储这个整数。

UTF-16

最简单的想法是,就像ASCII代码一样,整数被存储在字符被映射到中。例如,“ i”的存储方法是。直接存储字符集的编码方法称为UTF-16,其中UTF代表“”,而16个表示编码方法使用16位(IE 2个字节)来存储字符。 UTF-16的编码方法有几个问题。首先,只使用了两个字节,我们如何表示总共有17架飞机的角色集?原因是每个平面中都有许多未使用的代码字。对于超平面中的字符(上方1),UTF-16使用BMP平面中未使用的代码字形成代理对(4个字节)来表示它们。其次,对于ASCII代码,两个字节太浪费了(仅需要7位),ASCII代码是我们最常用的字符集,因此,如果使用UTF-16编码,则会导致巨大的废物;第三,由于网络中有两个末端序列,因此UTF-16编码必须指示编码的这一部分是在传输过程中的大型或小型式的,否则解码过程中会有歧义。例如,字符“ i”是使用UTF-16编码的,并在大端中传输,而接收器则以小型秩序接收到它,然后在解码后成为字符“ᅢ”,导致歧义。 UTF-16使用字节订单标记(BOM)来解决此问题。其中有一个特殊的角色“ u+feff”,而FFFE不存在。因此,UTF-16要求所有编码文档的前两个字节存储BOM。如果存储是大型字节顺序,则该文档是由小型字节顺序进行的,如果存储为小字节,则是小字节订单。

另一个不是很有用的编码方法是UTF-32。顾名思义,它使用32位(4个字节)存储字符(实际上存储了UCS-4字符集)。因为此方法太浪费了空间,基本上将不使用。

UTF-8

鉴于UTF-16和UTF-32的各种缺点,已经出现并成为世界上最受欢迎的编码方法的UTF-8编码。 UTF-8并不意味着将字符存储在单个字节中,而是在可变长度字节中存储。字节长度从1到4个字节不等。 UTF-8的编码方法相对简单:

对于ASCII代码,UTF-8使用单字节存储,最高位为0,因此ASCII代码和UTF-8代码可以直接兼容;

For other , UTF-8 uses 2~4 bytes to store, where the of the first byte is '110', '1110', '11110', '11110', that the is in 2, 3, and 4 bytes (the of the first ones), while the of the few bytes are all '10', and the of the are in the of each 字节。

例如:字符“ A”的UTF-8编码与ASCII代码相同,即0x61;虽然字符“ i”需要三个字节编码,但第一个字节是,第二个字节是,第三个字节为。我们采用字节的预设,其余部分合并在一起,它们的十六进制表示是一个整数,它是由我们之前看到的角色“ i”所映射的角色。

UTF-8解决了最终的问题。由于UTF-8标记了每个字符的标题,因此当机器读取0xE6(由字符“ Me”编码的第一个字节)时,众所周知,它会继续读取两个字节和解码,而不是在小型境界和大端和大端中反向解码。

以前的文章:

·结尾·

不仅仅是

生活短而简单

提醒:请联系我时一定说明是从星空网上看到的!