/–error.html
无论你是拥有多年经验的老司机,还是刚刚入门的新手,你一定都遇到过错误。 每当遇到错误时,我们都会使用该函数一遍又一遍地进行转换。 有时,只要尝试一下,问题就解决了。 无论你如何努力,你都只能向专家求助,但你似乎很少关心问题的本质。 下次遇到类似的问题,重复同样的错误时,你有没有想过一下子彻底理解字符编码?
在充分了解字符编码的起源和字符编码之前,我们需要先明确一些基本概念。 虽然我们每天都会接触到甚至使用一些概念,但我们并不一定真正理解它们。 例如:字节、字符、字符集、字符代码、字符编码。
字节
字节是计算机中数据存储的基本单位。 一个字节等于一个 8 位的位。 计算机中的所有数据,无论是保存在磁盘文件上还是在网络上传输(文本、图片、视频、音频文件)都是由字节组成的。
特点
您正在阅读的文章由许多字符()组成。 字符是一个信息单元。 它是各种文字和符号的统称。 例如,英文字母是一个字符,汉字是一个字符,标点符号也是一个字符。
字符集
字符集(Set)是一定范围内的字符的集合。 不同的字符集指定字符数。 例如,ASCII字符集共有128个字符,包括英文字母、阿拉伯数字、标点符号和控制字符。 该字符集定义了7445个字符,其中包括大部分汉字。
字符代码
字符代码(Code Point)是指字符集中每个字符的数字编号。 例如,ASCII字符集使用0到127的128个连续数字分别表示128个字符。 例如,“A”的字符代码编号为65。
字符编码
字符编码( )是将字符集中的字符编码映射为字节流的一种具体实现方案。 常见的字符编码有ASCII编码、UTF-8编码、GBK编码等,从某种意义上来说,字符集和字符编码具有对应关系。 例如,ASCII字符集对应于ASCII编码。 ASCII字符编码规定用单个字节的低7位来对所有字符进行编码。 例如“A”的个数是65,单字节表示为0×41,那么写入存储设备时就是b''。
编码解码
编码过程是将字符转换为字节流,解码过程是将字节流解析为字符。
了解了这些基本术语概念后,我们就可以开始讨论计算机字符编码的演变。
我们先从 ASCII 码开始
说到字符编码,还得从计算机的诞生说起。 计算机是在美国发明的。 在英语世界中,常用的字符非常有限,只有 26 个字母(大小写)、10 个数字、标点符号和控制字符。 这些字符在计算机中用一个字节的存储空间来表示是绰绰有余的,因为1个字节相当于8个位,8个位可以表示256个符号。 于是美国国家标准协会ANSI制定了一套字符编码标准,称为ASCII(Code for)。 每个字符对应一个唯一的数字。 例如,字符“A”对应数字65,“B”对应66,依此类推。 。 最早的ASCII只定义了128个字符代码,其中包括96个文本和32个控制符号。 总共 128 个字符只需要一个字节的 7 位来表示所有字符,因此 ASCII 只使用一个字节的最后 7 位。 位,其余 1 位在某些通信系统中用作奇偶校验。下图是十进制、二进制和 ASCII 字符编码的字符的对应表。
扩展 ASCII:(ISO/8859-1)
然而,当计算机慢慢普及到其他西欧地区时,人们发现有很多西欧字符并不在 ASCII 字符集中。 显然ASCII已经不能满足人们的需求了。 幸运的是,ASCII 字符仅使用字节的 7 位 0×。 00~0x7F共有128个字符,因此他们在ASCII的基础上将原来的7位扩展为8位,并使用了0×80-0xFF之后的128个数字。 它被称为,它与ASCII完全兼容,扩展的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。 然而,这个时代是一个混乱的时代。 每个厂家都有自己的想法,没有统一的标准。 他们各自根据自己的最高位标准实现自己的一套字符编码标准。 比较有名的就是CP437,它是始祖。 IBM PC和MS-DOS使用的字符编码如下所示:
许多ASCII扩展字符集彼此不兼容,这阻碍了人们的正常交流。 例如,字符200在CP437字符集中用È表示,在ISO/8859-1字符集中显示╚,因此国际标准化组织(ISO/8859-1(Latin-1),一系列ISO 和国际电工委员会(IEC)联合制定的 8 位字符集标准,继承了 CP437 字符编码的 128-159 之间的字符,因此由 160 衍生而来,ISO-8859-1 重新定义了 160 到 160 之间的字符255 基于 CP437。
多字节字符编码GBK
ASCII 字符编码是一种单字节编码。 计算机进入中国后面临的问题之一就是如何处理汉字。 对于拉丁语国家来说,通过扩展最高位,单个字节足以表示所有字符,但对于亚洲国家来说,一个字节就显得捉襟见肘了。 于是中国人开发了自己的双字节字符编码,也称为GB0,由中国国家标准总局于1981年发布。该编码共包含6763个汉字,同时也兼容ASCII。 GB 2312的出现基本上满足了汉字的计算机处理需要。 其包含的汉字已经覆盖了中国大陆99.75%的使用频率,但仍不能100%满足汉字的需求。 由于对汉字的需求,一些生僻字和繁体字无法处理。 后来,基于中文和其他主要少数民族语言创建了名为 GBK 的编码。 同样,GBK也兼容ASCII编码。 英文字符用1个字节表示,汉字用2个字节表示。
的出现
GBK只解决我们自己的问题,但计算机不仅是美国人和中国人使用的,还有欧洲和亚洲其他国家的文字,例如日语和韩语。 据估计,有来自世界各地的数十万条文本。 已经大大超出了ASCII码甚至GBK所能表示的范围。 虽然每个国家都可以制定自己的编码方案,但是数据在不同国家传输时会出现各种乱码问题。 如果只用一种字符编码就可以表示地球甚至火星上的任意字符,那么问题就迎刃而解了。 就是它,就是它,就是它,我们的小英雄,统一联盟国际组织提出的编码,学名是“-Octet Coded Set”,缩写为UCS。 它为世界上每种语言的每个字符定义了唯一的字符代码。 该标准使用十六进制数字来表示它们。 这些数字前面带有前缀 U+。 例如字母“A”的编码为U+0041,汉字“中”的编码为U+4E2D
有两种格式:UCS-2 和 UCS-4。 UCS-2使用两个字节进行编码,总共16位。 理论上,它最多可以表示 65,536 个字符。 然而,用65536个数字来表示世界上所有的字符还远远不够,因为仅汉字就有近65536个字符。 100,000,因此.0规范定义了一组附加的字符编码。 UCS-4使用4个字节(实际上只使用了31位,并且最高位必须为0)。 理论上,它可以涵盖语言中使用的所有符号。
局限性
但也有一定的局限性。 当一个字符在网络上传输或最终存储时,每个字符不一定需要两个字节。 例如,字符“A”可以用一个字节来表示。 它还使用了两个字节,这显然是浪费空间。
第二个问题是,当一个字符保存在计算机中时,它是一串01数字。 那么计算机怎么知道一个2字节的字符代表一个2字节的字符呢? 例如“中文”字符的编码是U+6C49。 我可以用4个ASCII数字来传输和保存这个字符; 我也可以用UTF-8编码的3个连续字节E6 B1 89来表示。 关键是沟通双方都必须同意。 因此,编码有不同的实现方式,例如:UTF-8、UTF-16等。就像英语一样,作为国家间交流的通用标准,每个国家都有自己的语言。 他们将标准英文文件翻译成自己国家的文本。 这是实现的方式,就像utf-8一样。
具体实现:UTF-8
UTF-8()作为一种实现方式,在互联网上得到了广泛的应用。 它是一种变长字符编码,根据具体情况可以用1-4个字节来表示一个字符。 例如,原本可以用ASCII码表示的英文字符,用UTF-8表示时只需要一个字节的空间,这和ASCII是一样的。 对于多字节(n个字节)字符,第一个字节的前n位设置为1,第n+1位设置为0,后面字节的前两位设置为10。剩余的二进制数字用字符的代码填充。
以“好”为例。 “Good”对应的是597D,对应的区间是0000 0800–0000 FFFF。 因此,用UTF-8表示时需要存储3个字节。 597D用二进制表示:11101,填充它得到10,转换为十六进制,所以“好”码U+597D对应的UTF-8编码是“”。 可以用代码验证一下:
>>> a = u“好”
>>> 一个
你'u597d'
>>> b = a.('utf-8')
>>>长度(b)
>>> 乙
'xe5xa5xbd'
现在我终于把理论讲完了。 我们来谈谈编码问题。 诞生的时间比 早得多,它的默认编码是 ASCII。 正因为如此,存在很多编码问题。
>>>
>>> 系统。()
'ascii'
因此,在源代码文件中必须显式指定编码类型,否则只要代码中有中文就会报语法错误。
#=utf-8
或者它可能是:
# -*- : utf-8 -*-
字符类型
国内与字符串相关的数据类型有str和,都是继承自. str类型字符串的编码格式可以是ascii、utf-8、gbk等任意类型。
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。