论坛门户网站建设运营费用,百度推广图片尺寸要求,网页微信版官方下载,互联网做网站属于什么行业个人博客
编码的历史由来就懒得介绍了#xff0c;只需要知道人类处理文本信息是以字符为基本单位#xff0c;而计算机在最底层只认识 0/1#xff0c;所以当计算机要为人类存储/呈现字符时#xff0c;就需要有一个规则#xff0c;在字符和 0/1 序列之间建立映射关系#…个人博客
编码的历史由来就懒得介绍了只需要知道人类处理文本信息是以字符为基本单位而计算机在最底层只认识 0/1所以当计算机要为人类存储/呈现字符时就需要有一个规则在字符和 0/1 序列之间建立映射关系这就是编码规则。
因为计算机技术起源于欧美所以最早的字符编码标准自然而然是基于英语制定的英语最大的特点是它仅由 26 个大小写字母组合而成再加上一些特殊字符就构成了英语的文本世界其基本字符的总数不会超过 128 个鉴于 7 个比特位可以有 128 种 0/1 组合所以用 7 个比特位就足以应付所有需要编码的字符这样最早的统一标准就诞生了称为 ASCIIAmerican Standard Code for Information Interchange美国信息交换标准码码。在 Linux 系统中输入 man ascii可以得到如下 ascii 码表 以字符 ‘a’ 为例16 进制编码为 61对应的 10 机制表示就是 97对应的二进制表示为 0110 0001。但西方世界也不是只有英语字母于是从 1987 年开始ISO 基于 8 比特位制定了 ISO-8859 系列编码标准系列中的每一个标准用到的编码位数都不超过 8 位。 按 ascii 和 ISO-8859 编码标准的规定其包含的字符都可以用一个字节8 比特表示在存储时也就只占用一个字节但世界上并不只有西方文字还有很多其他类型。
最典型就是中文中文是典型的象形文字而且是世界上使用人数最多的文字常用汉字数量就不止 1000 个指望 ascii 是不行的——就算把存 ascii 码的 8 个比特全用来表示中文也不够所以也发展出了自己的一套编码规范
1980 年中国搞了自己的编码方案 GB/T 2312GB/T 代表推荐性国家标准可以参考前一篇 博文 里的介绍一般简称 GB2312。1993 年国际标准化组织 ISO 制定了编码标准 ISO/IEC 10646-1:1993国内予以承认并编号为 GB 13000.1-1993。1995 年国内基于 GB2312 扩展了一套编码方案 GBK汉字内码扩展规范并收录了 GB13000.1 和 Big5由台湾资讯工业策进会在1984 年制定中的汉字微软在 Windows 95、Windows NT 3.51 中进行了实现称为 Code Page 936。2000 年制定了国标 GB 18030-2000目前已作废。2005 年制定了国标 GB 18030-2005为现行的 GB18030 标准。2022 年制定了国标 GB 18030-2022将在 2023年8月1日生效。
GB2312、GBK、GB18030 就是目前老系统中常用的三种中文编码方案。
这还只是中文当我们把眼界放大到整个地球球外暂不考虑仅仅东亚就还有日文、韩文还有中亚、中东、非洲等等国家和地区的文字都需要编码进计算机。如此多的国家和地区如此多的语言文字再各自搞一套就真乱成一锅粥了除了 ASCII 被默认继承同一个或两个字节在不同的编码标准中基本就代表着不同的字符必须要找到正确的标准才能进行解码在计算机互通的情况下这变得很复杂。一套统一的、国际化的编码标准势在必行尤其对于跨国公司开展全球化业务所以 Unicode 的诞生可以说是名正言顺。
第一版 Unicode 早在 1991 年就发布了目前已发展到第 15 版。 在早期的 ASCII 编码标准中因为一个 8 位的字节就可以表示完字符集中所有的字符而字节也正是计算机中进行运算、存储的基本单元如 8 位是传统的加法器、锁存器、数据选择器的输入/输出所以编码、运算、存储时没什么可争议的。但当被编码的字符数量超过了一个字节可以有的组合数时就变得有趣了。
举个例子假设我现在有 257 个字符需要编码到同一个编码标准中由于 8 位最多只有 256 种组合0-255对于第 257 个字符至少要再加 1 位达到 9 位才能给这个多出来的字符一个唯一编码如 1 0000 0000但我们是用数字来对字符进行编码的在计算机中表示数字的基本单元是 8 位的字节不存在 9 位的基本单元也就是说要想在计算机里进行处理必须把第 257 个字符呈现为 2 个字节如 0000 0001 0000 0000。以此类推当我需要表示出第 65536 个字符时在计算机里至少需要 3 个字节如果字符数量继续增加就得按这个逻辑继续增加字节数。
从举的例子来看计算机中的字符编码虽然比实际编码多了一些比特位因为只是高位补 0两者的值还是一致的实际使用中则没有这么简单。
让我们再次回到例子中现在我有 257 个字符第 257 个字符的十进制编码值是 256在计算机中至少要用两个字节表示 —— 0000 0001 0000 0000。现在我要表示十进制编码值是 1 的第 2 个字符在计算机中既可以用 1 个字节表示—— 0000 0001也可以用 2 个字节表示 —— 0000 0000 0000 0001。那么是用 1 个字节还是 2 个字节
如果用 2 个字节每个字符编码时所用的字节数就是一样的便于寻址代价是对资源的浪费。如果内存、存储成本昂贵则固定 2 字节的方案就值得商榷。
如果用 1 个字节就存在两种情况有的字符用 1 个字节表示有的字符必须用 2 个字节表示字符对应的字节数不固定这时就需要在第 1 个字节中告诉计算机读到当前字节就可以开始解码还是要再读取 1 个字节用 2 个字节来解码。需要表示这个信息可以基于固有的大小属性进行表示也可以添加额外的位来表示。
可以看到编码值和在计算机中的实际编码所要表达的含义具有差别前者目的是做符号的唯一数字标识后者还要考虑计算机本身的限制因为 Unicode 要收录所有的字符到同一个编码标准中必然存在超过一个字节的情况所以分得很清楚前者被称为 Code Point后者被称为 Code Units在前面介绍的几种编码标准ASCII、GB2312、GBK、GB18030、Big5中每一种标准的 Code Point 和 Code Units 都是确定的。但在 Unicode 中只规定了 Code Points没有规定 Code Units当我们说 Unicode 时说的只是一套统一的字符集和它对应的 Code PointsU0000 ~ U10FFFF并不包含在计算机中实际是怎么编码表示的。只有当说 UTF-8、UTF-16、UTF-32 时才表示在使用 Unicode 字符集的基础上在计算机中字符具体的 Code Units 是怎样的。三种方案的差别就在于 Code Units 的大小实际使用中根据需要进行选择。
简单看一下 UTF-8 中对 Code Units 是如何规定的。 UTF-8 中所有字符的 Code Units 长度并不一致
1 字节第一个字节的高 1 位为 0兼容 ASCII2 字节第一个字节的高 2 位为 1第 3 位为 03 字节第一个字节的高 3 位为 1第 4 位为 04 字节第一个字节的高 4 位为 1第 5 位为 0。
而在 UTF-16 中字符有 2 字节、4 字节两种长度在 UTF-32 中所有字符都用 4 字节。
以 ‘蛤’ 为例在 Unicode 中的 Code Point 是 U86E4在 UTF-8、UTF-16有大小端之分、UTF-32有大小端之分下的表示分别是
UTF-8E8 9B A411101000 10011011 10100100把背景高亮部分抽出来就是 10000110 11100100也就是 16 进制的 86 E4UTF-16BE86 E4UTF-32BE00 00 86 E4