龙空技术网

Python之字符编码

零幻624 187

前言:

此刻大家对“pythongb2312”大概比较关切,看官们都需要学习一些“pythongb2312”的相关内容。那么小编在网上搜集了一些关于“pythongb2312””的相关内容,希望同学们能喜欢,我们一起来了解一下吧!

背景:

计算机以数字为处理对象,处理文本时需先转换为数字。早期计算机将 8 个比特设为 1 个字节,1 字节能表示的最大整数为 255(二进制 11111111 对应十进制 255),若表示更大整数则需更多字节,如 2 字节最大可表 65535,4 字节可达 4294967295。

计算机由美国人发明,最初仅 127 个字符被编入计算机,涵盖大小写英文字母、数字与部分符号,此编码表即 ASCII 编码,像大写字母 A 编码是 65,小写字母 z 编码为 122。

然而处理中文时,单字节远远不够,起码需两字节且不能与 ASCII 编码冲突,于是中国制定了 GB2312 编码用于中文编码。

不难想象,全球有众多语言,日本将日文编入 Shift_JIS,韩国把韩文编入 Euc-kr,各国皆有自身标准,这必然引发冲突,致使多语言混合文本出现乱码现象。

由此,Unicode 字符集顺势而生。Unicode 把世界上的所有语言都整合进同一套编码体系,从而有效解决了乱码困扰。

Unicode 标准处于持续演进之中,其中最为常用的是 UCS - 16 编码,它采用两个字节来表示一个字符(不过在处理极为生僻字符时则需 4 个字节)。现代操作系统以及绝大多数编程语言均已直接支持 Unicode。

UTF-8:

下面梳理一下 ASCII 编码与 Unicode 编码的差异:ASCII 编码仅占用 1 个字节,而 Unicode 编码一般是 2 个字节。

例如,字母 A 在 ASCII 编码下是十进制的 65,对应的二进制为 01000001;字符 0 在 ASCII 编码里是十进制的 48,二进制是 00110000,需要留意的是字符 '0' 和整数 0 并非同一概念;汉字因超出了 ASCII 编码范畴,在 Unicode 编码“中”是十进制的 20013,二进制为 01001110 00101101。

可以推测,若将 ASCII 编码的 A 转换为 Unicode 编码,只需在其前面补 0 即可,所以 A 的 Unicode 编码是 00000000 01000001。

但新的难题又接踵而至:一旦统一采用 Unicode 编码,乱码现象虽不复存在。可要是所编写的文本几乎全是英文内容,使用 Unicode 编码相较 ASCII 编码会多耗费一倍的存储空间,这在存储与传输过程中极为不经济。

故而,秉持节约理念,又催生出将 Unicode 编码转换为 “可变长编码” 的 UTF - 8 编码。UTF - 8 编码能够依据 Unicode 字符数字大小的不同,将其编码成 1 - 6 个字节,常见的英文字母被编码为 1 个字节,汉字通常是 3 个字节,只有极为罕见生僻的字符才会被编码成 4 - 6 个字节。若传输的文本包含大量英文字符,运用 UTF - 8 编码便能有效节省空间:

字符

ASCII

Unicode

UTF - 8

A

01000001

00000000 01000001

01000001

01001110 00101101

11100100 10111000 10101101

从上述表格还能发现,UTF - 8 编码具备一个额外优势,即 ASCII 编码实际上可被视作 UTF - 8 编码的一个子集,所以众多仅支持 ASCII 编码的老旧软件在 UTF - 8 编码环境下依然能够正常运行。

结论:

明晰了 ASCII、Unicode 和 UTF - 8 三者之间的关系后,便能总结出当下计算机系统通用的字符编码运作模式:

在计算机内存之中,统一运用 Unicode 编码,而当需要存储至硬盘或者进行传输操作时,则转换为 UTF - 8 编码。

使用记事本编辑时,从文件读取的 UTF - 8 字符会被转换为 Unicode 字符存入内存,编辑完成后,保存时又会把 Unicode 转换回 UTF - 8 并保存至文件。

浏览网页时,服务器会将动态生成的 Unicode 内容转换为 UTF - 8 后再传输至浏览器。

这便是为何我们能看到很多网页源码中有类似 <meta charset="UTF - 8" /> 的标识,表明该网页采用的正是 UTF - 8 编码。

标签: #pythongb2312