何为字符编码
计算机只有 0 和 1。但人是看不懂二进制的。
字符的编码和解码,其实就是人类可识别的字符与计算机可识别的数据之间的翻译过程
编码规则
人为了能够让计算机把花里胡哨的符号存起来,就必须用 0 和 1 的各种组合来代表这些符号。
那应该用何种规则来组合这些 0 和 1 呢?
假设张三给自己搞了一套规则: 用 0-9 十进制数来表示阿拉伯数字 0-9,用 10-35 十进制数来表示英文字母 a-z。
但李四另起炉灶搞了一套规则: 用 0-25 的十进制数来表示英文字母 a-z,用 26-35 十进制数来表述阿拉伯数字 0-9。
张三跟李四打招呼: helloworld。然后用张三的编码规则编码后发给李四。
编码后的数据是 17 14 21 21 24 32 24 27 21 13。
李四收到之后按照李四的编码来解码。李四读到的就是 rovvy6y1vn。
字符与计算机能识别的数据之间的转换,就是编码和解码
上面两个编码规则,仅仅只是为了举例而编的。现实情况的编码规则比这个复杂得多。
上述例子还引出了两个新的概念:
- 字符集
- 码位 (码元)
字符集与码位
字符集是多个字符的集合。
码位指一个字符在字符集中的位置。
这些定义看起来跟没有定义差不多,但举例子的话会好理解很多。
常见的字符集
摩尔斯电码 (Morse code)
这个是国际摩尔斯电码表,电报时代的产物。它的字符集就是英文字母 A-Z 和阿拉伯数字 0-9。其中每个字符都有自己码位, 即点和线的不同组合。
ASCII (American Standard Code for Information Interchange, /ˈæski/,美国信息交换标准代码)

熟悉的 ASCII 码,用 7 位标识一个字符。0-31 和 127 为控制字符,非显示字符。32-126 (95个) 为显示字符。共 128 码位。
0b 0000 0000 (0d 0)
-
0b 0111 1111 (0d 127)
这个区间是 ASCII 的码位区间
------
0b 0010 0000 (0d 32)
-
0b 0111 1110 (0d 126)
这个区间为显示字符, 总计 95 个码位
EASCII / ISO-8859 (Extended ASCII,延伸美国标准信息交换码)
严格意义上来说,EASCII 编码不是一种编码规则, 而是许多中编码规则的统称. 而是在原本只使用低 7 位的 ASCII 码的基础上,把第 8 位也用上,扩展了字符集,所以才叫扩展 ASCII。
因 ASCII 只有 95 个可显示字符,在很多国家里面是不方便使用的。所以很多国家都想扩展 ASCII 码,将第 8 位用起来。用于支持更多本地化的可显示字符。
因 EASCII 有很多种版本,所以 ISO 最终发布了标准 ISO-8859 。
ISO-8859 其实就是使用不同语言的国家在兼容 ASCII 编码基础上, 针对自己国家使用的语言做的 l10n 实现。
其中最受欢迎的一套标准是 ISO-8859-1 又称 ISO Latin 1,包含了最常见的西欧语言的字符。
其它语言也发布了标准,从 ISO-8859-1 到 ISO-8859-16,但其中 -12 标准被搁置了。有兴趣可以的同学可以在 ISO-8859 页面上看下各个标准下的不同码位都是什么字符
有意思的是的是 ISO-8859 标准没有定义 128-159 这段码位的字符。后来微软在自己的 Windows 上整了个西欧语言 ISO-8859-1 的超集: Windows-1252 (这个 Windows-1252 也被误传为 ANSI 并广为流传),在 ISO-8859-1 的基础上,把 128-159 之间的码位都用上了。
有一个有趣的现象。计算机在上世纪还是西方主导发展的。又加上 Windows 在上世纪在 PC 平台的市场占有率相当的高。所以微软自家的 Windows-1252 实际上成为了在 Unicode 出现前,事实上的互联网的标准。
0b 1000 0000 (0d 128)
-
0b 1111 1111 (0d 255)
这个区间不属于 ASCII 的码位中, 所以这部分的码位可以被用来放新字符
------
0b 1010 0000 (0d 160)
-
0b 1111 1111 (0d 255)
这个区间为 ISO-8859 标准所使用的码位
------
0b 1000 0000 (0d 128)
-
0b 1001 1111 (0d 159)
这个区间没有被 ISO-8859 标准所使用, 但是 Windows-1252 用了这段码位
汉字编码
上面说了那么多西方字符的编码,一直都没有提到我们博大精深的汉字,实属没有牌面。因为祖国的国情, 所以中国大陆的汉字编码出现的时间非常晚.
直到 1980 年,中国大陆才正式发布第一个简体中文字符编码: GB 2312 (中华人民共和国国家标准简体中文字符集)。
下面只讲中国的官方标准 GB 系列和国际标准 Unicode 的汉字字符集及其编码. 其它地区所用的诸如 Big5 及其扩展字符集不会涉及.
GB/T 2312-1980 (《信息交换用汉字编码字符集·基本集》)
汉字是表意文字。所以字符数量跟拉美系语言相比而言,两者完全不在同一个量级。所以 GB 2312 便突破了 ASCII 系字符集的单字节编码设计,使用了双字节编码。最多有 65535 个码位。
GB/T 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
GB/T 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。但对于人名、古汉语等方面出现的罕用字和繁体字,GB/T 2312不能处理,因此后来GBK及GB 18030汉字字符集相继出现以解决这些问题。
GB/T 2312 是全世界使用第一多的汉字编码.
与之对应的还有一个繁体字国标字符编码: GB/T 12345-1990
中文字符占两个字节,这一理念在这个时候就是标准. 于是乎也顺理成章的被写进了各种教科书,并广为流传。但其实, 这句话放在今天来看, 已经有失偏颇.
GB/T 2312 作为二字节编码, 兼容了 ASCII. 所以在 (0d 0 - 0d 127) 这个码位区间可以用单字节表示.
而双字节部分则由高位字节和低位字节两个部分组成.
------
高位字节的范围是
0b 1010 0001 (0d 161)
-
0b 1111 0111 (0d 247)
低位字节的范围是
0b 1010 0001 (0d 161)
-
0b 1111 1110 (0d 254)
------
可以根据每个字节的首位来判断这个字节是属于单字节编码的 ASCII, 还是由双字节组成的双字节编码.
但是无法根据一个字节来判断出是双字节编码中的高位还是低位字节
GBK (汉字内码扩展规范)
GBK 正式发布与 1995 年. GBK 这个名字的含义是: 国标的扩展. 即为 GB/T 2312 的扩展. 即 GBK 是 GB/T 2312 的超集, 包含其全部字符.
GBK 包含了繁体字, 也包含了 1980 年后经过简化的繁体字.
GBK 在身份上并不属于国家标准. 但其实是全世界使用第二多的汉字编码.
汉字内码扩展规范,称GBK,全名为《汉字内码扩展规范(GBK)》1.0版,由中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司和电子工业部科技与质量监督司1995年12月15日联合以《技术标函[1995]229号》文件的形式公布。 GBK共收录21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。
GB-13000
GB 13000,中华人民共和国国家标准的国家标准代码之一,全称 GB 13000.1-93《信息技术 通用多八位编码字符集(UCS)第一部分:体系结构与基本多文种平面》。此标准等同采用国际标准化组织 ISO/IEC 10646.1:1993《信息技术 通用多八位编码字符集(UCS)第一部分:体系结构与基本多文种平面》。即“GB 13000.1-93”等同于Unicode 1.1版本。
GB 13000.1-93的字符集包含20,902个汉字,附录是GBK。
2010年1月10日发布的GB 13000-2010取代了GB 13000.1-93,于2010年11月1日实施。是ISO/IEC 10646:2003《信息技术 通用多八位编码字符集(UCS)》等同采用。由中国标准出版社出版,16开1476页。
GB-13000 是首个支持 ISO 10646 (UCS) 标准的国标字符集。可以理解成他等同于 Unicode 1.1 版本.
GB-18030
GB 18030,全称《信息技术 中文编码字符集》,是中华人民共和国国家标准所规定的变长多字节字符集。其对GB 2312-1980完全向后兼容,与GBK基本向后兼容,并支持Unicode(GB 13000)的所有码位。GB 18030共收录汉字70,244个。
这个字符集,完全兼容 GB 2312 编码,,基本兼容 GBK。同时支持 GB 13000 (即 Unicode) 的所有码位。共收录汉字 70,244 个。
虽然 GB 18030 能够支持 Unicode 的所有码位, 但是它采用的变长多字节编码规则中, 每个字符可以由 1, 2 或 4 个字节组成. 其编码规则与我们常见的 Unicode 官方 UTF 系列编码有所不同.
理论上来说,因为 GB 18030 编码完全支持 Unicode 所有码位的编码。所以它也能算是一种 “UTF” 编码。
Unicode
从 ASCII 发展到 EASCII/ISO-8859-1/Windows-1252。字符集已经支持了西方世界的主流语言。虽然在计算机发展的初期够用,但随着时间的推进,越来越多使用不同语言的人开始使用计算机和互联网。最高只支持 8 位的 ASCII 及其变种字符集已经不足以应对多语言多编码的互联网环境,无法为全世界互联互通带来统一的标准。
虽然 ISO-8859 能够支持双语言(拉丁字母和本地语言),但无法支持多语言环境。
于是 Unicode 出现了。
Unicode 的目标是: 能够编码世界上的绝大多数文字系统中的字符与符号。经过计算机的多年发展和越来越多人接入互联网,毫不夸张的说,Unicode 已经是实际意义上的互联网的标准字符集了。
Unicode 只是一个字符集。Unicode 的标准定义了它的几个主要字符编码实现: UTF-8,UTF-16,UTF-32。
《The Unicode Standard Version 6.2 – Core Specification》文档给出了Unicode的十大设计原则:
- Universality:提供单一、综合的字符集,编码一切现代与大部分历史文献的字符。
- Efficiency:易于处理与分析。
- Characters,not glyphs:字符,而不是字形。
- Semantics:字符要有良好定义的语义
- Plain text:仅限于文本字符
- Logical order:默认内存表示是其逻辑序
- Unification:把不同语言的同一书写系统(scripts)中相同字符统一起来。
- Dynamic composition:附加符号可以动态组合。
- Stability:已分配的字符与语义不再改变。
- Convertibility:Unicode与其他著名字符集可以精确转换。
Characters,not glyphs (为每个字符而非每个字形分配码位)
这个是 Unicode 字符集的一个码位分配原则。举个例子就很好理解: 比如中文字体的宋体,黑体,各种花里胡哨体等,这些字体属于不同字形,但在 Unicode 中是同一个字符,只占一个码位。
Unicode 这种对于字符而非字形确定码位的做法,在制定世界上大部分语言的文字字符时,都是没什么问题的。但是在使用汉字的各个国家和地区中,尤其是东亚地区的汉字使用上,由于复杂的历史原因,规定汉字的Unicode 码位不是一件易事 。
关于汉字的编码标准制定,可以说是一波三折。
从 1978 年日本制定出全世界最早的汉字编码 JIS C 6226 标准, 1974 年韩国 (KS X 1001),1980 中国大陆 (GB 2312),1984 台湾 (Big5),分别制定出自己的标准。最终直到 1993 年, 在各国多专家的努力下才正式推出 中日韩统一表意文字 (CJK) 标准。并在 Unicode 1.1 版本作为标准正式加入 Unicode。
前后历时 15 年,才基本将汉字加入 Unicode。然而还是有很多看起来同字形的汉字,分配了多个不同的 Unicode 码位 。如下面的汉字: 次. 在多种语言中字形无法统一, 在 Unicode 中分配了多个码位.
![]()
平面 (Plane)
Unicode 字符集是由多个 平面 所组成的。平面就是 65536 (2^16) 个码位的连续集,所以一个平面最多可分配 2^16=65536 个码位。目前 Unicode 共划分了 17 个平面(0-16),但其中有两个平面(15-16)是用作私人用途的,所以 Unicode 字符集的理论最大可分配码位达到了 15*65536=983,040,数量是非常可观的。
下面大致描述下各个平面主要分配了那些字符
基本多文种平面 (Basic Multilingual Plane,BMP,Plane 0)
![]()
图中每个格子代表了最多可分配 2^8=256 个码位。一共有 16*16=256 个格子。总计每个平面最多可分配 256*256=65536 个码位。
BMP 的码位范围在 U+0000-U+FFFF,几乎包含了所有现代语言的字符和符号。
其中大家熟悉的 ASCII 字符集的变体 IOS-8859-1 占据了第 0-255 码位。
BMP 的很大一部分码位都分配给了博大精深的汉字字符(中日韩),如上图 34-9F 单元格。但并非所有汉字都被分配到了 BMP,后续会提到。
DC00-DBFF 被分配了作为高位代理, DC00-DFFF 被分配了作为低位代理. 这两个代理被用来作为 UTF-16 编码规则的一部分. 后续会提到.
BMP 还剩 64 个码位尚未分配。分别位于 0870-089F (48 码位) 和 2FE0-2FEF (16 码位)。

多文种补充平面 (Supplementary Multilingual Plane,SMP,Plane 1)
![]()
SMP 的码位范围在 U+10000-U+1FFFF 之间。其中分配了:
- 历史文字,现时不再使用的文字
- 现代文字,指的是现代被发明出来的文字,而不是现代在用的文字
- 符号和注解,包括了历史上和现代的音乐符号和注解
- 数学相关的字母符号
- 手写简写字符
- 绘文字(Emoji),表情符号和一些卡牌和桌游的符号(扑克,麻将,多米诺骨牌等)
表意文字补充平面 (Supplementary Ideographic Plane,SIP,Plane 2)
![]()
SIP 的码位范围在 U+20000-U+2FFFF 之间。这个平面分配的都是中日韩统一表意文字的扩展字符。
整个平面配置的都是一些罕用的汉字或地区的方言用字,如粤语用字及越南语的字喃。现时摆放了“中日韩统一表意文字扩展B区”(4万3253个汉字)、“中日韩统一表意文字扩展C区”(4149个汉字)、“中日韩统一表意文字扩展D区”(222个汉字)、“中日韩统一表意文字扩展E区”(5762个汉字)、“中日韩统一表意文字扩展F区”(7473个汉字)以及中日韩兼容表意文字增补(CJK Compatibility Ideographs Supplement)。
第三表意文字平面 (Tertiary Ideographic Plane,TIP,Plane 3)
![]()
本平面现已用来摆放汉字扩展区G,并规划用于摆放甲骨文、金文、小篆、中国战国时期文字等。
未分配的平面
目前,从平面 4 - 平面 13 都没有分配任何码位,也暂时没有使用计划
特别用途补充平面 (Supplementary Special-purpose Plane,SSP,Plane 14)
平面 14,目前仅分配了[“语言编码标签”](https://en.wikipedia.org/wiki/Tags_(Unicode_block)和“字形变换选取器”,它们都是控制字符
![]()
私人用途补充区域-A&-B (Supplementary Private Use Area-A and -B,PUA-A and PUA-B))
平面 15 和平面 16 这两个平面分配出来是给 Unicode 联盟和 ISO 组织以外的各方使用的。没有统一的标准,大家可以随意使用。
至此,大致介绍了一下 Unicode 的 17 个平面(0-16)。
Unicode 编码
现在是全球化的时代。个人认为只有国际通用的标准才是最适合的标准。所以只打算讲 Unicode 的字符编码实现。其它字符集的编码标准不讨论。
从上述平面分配就可以看出。Unicode 最大支持的码位是 U+10 FF FF,所以需要 3 个字节才能完整表达一个 Unicode 码位。如果每个字符都需要 3 个字节来表达,是非常不利于数据的存储和传输的,和 ASCII,ISO-8859-1 所需要的 1 字节比起来,已经达到了 3 倍的大小。
综上,Unicode 字符集的编码直接采取码位来编码是不现实的。于是,Unicode 定义了两种从码位映射方案,即编码:
- Unicode Transformation Format (UTF) 编码
- Universal Coded Character Set (UCS) 编码
Unicode Transformation Format (UTF) 编码
UTF 编码,尤其是其中的变体: UTF-8 编码,已经成为了万维网上的最流行的编码了
先推荐一个在线工具,方便各种编码转换:https://onlineunicodetools.com
used in over 95% of websites as of 2020,and up to 100% for some languages(在 2020 年,已经超过 95% 的网站使用。在某些语言中已经达到了 100% 的使用率)
所以,我们的重点就应该放在这些"几乎是事实上的标准“的东西上。
UTF-8
UTF-8 是一种可变长字符编码,能够使用 1-4 个字节编码完整映射出 Unicode 的所有 1,112,064 (17个平面,每个平面 2^16=65536 的码位,再减去 2^11=2048 个分配给 UTF-16 的代理。即 17 * 2^16 - 2^11 =1,112,064) 个有效码位。
总体概括 UTF-8 的编码占用大小:
- UTF-8 完全兼容 ASCII 编码。所以 ASCII 码字符只占 1 个字节
- 几乎所有拉丁字母及其变音符号占用 2 字节。
- 常用中日韩汉字需要 3 字节。
- 其余不在基本多文种平面(BMP)的字符都需要 4 字节。常见的字符有数学符号和 Emoji。
UTF-8 字节序列分布:
| 字节数 | 最低支持的 Unicode 码位 | 最高支持的 Unicode 码位 | 字节 1 | 字节 2 | 字节 3 | 字节 4 | 最多支持多少位 Unicode 字符(所有字节总计的 x 数量) |
|---|---|---|---|---|---|---|---|
| 1 | U+0000 | U+007F | 0xxxxxxx | - | - | - | 7=8-1 |
| 2 | U+0080 | U+07FF | 110xxxxx | 10xxxxxx | - | - | 11=5+6 |
| 3 | U+0800 | U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | - | 17=4+6*2 |
| 4 | U+10000 | U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 21=3+6*3 |
从表可以看出。UTF-8 多字节编码实现有几个特点:
- 第一字节如果前缀是 0,那说明这个字符就是标准的 ASCII 字符。只占用了一个字节来编码此字符。
- 超过 ASCII 的部分后。第一字节的前缀就以 1 开头,且 1 的数量代表了此字符需要多少字节来表示完整的编码。随后以 0 结束前缀。除第一字节以外的其它字节,以前缀 10 来表示自己是多字节编码的一部分字节。所有字节处了前缀以外的位都用来表示 Unicode 码位。

MySQL 里的 utf8mb4
MySQL字符编码集中有两套UTF-8编码实现:“utf8”和“utf8mb4”,其中“utf8”是一个字最多占据3字节空间的编码实现;而“utf8mb4”则是一个字最多占据4字节空间的编码实现,也就是UTF-8的完整实现。这是由于MySQL在4.1版本开始支持UTF-8编码(当时参考UTF-8草案版本为RFC 2279)时,为2003年,并且在同年9月限制了其实现的UTF-8编码的空间占用最多为3字节,而UTF-8正式形成标准化文档(RFC 3629)是其之后。限制UTF-8编码实现的编码空间占用一般被认为是考虑到数据库文件设计的兼容性和读取最优化,但实际上并没有达到目的,而且在UTF-8编码开始出现需要存入非基本多文种平面的Unicode字符(例如emoji字符)时导致无法存入(由于3字节的实现只能存入基本多文种平面内的字符)。直到2010年在5.5版本推出“utf8mb4”来代替、“utf8”重命名为“utf8mb3”并调整“utf8”为“utf8mb3”的别名,并不建议使用旧“utf8”编码,以此修正遗留问题。
UTF-16
UTF-16 能够对 Unicode 所有的 1,112,064 个有效码点进行编码。实际上,Unicode 字符集的有效码位数,就是由 UTF-16 的设计决定的。
UTF-16 也是变长编码。每个 Unicode 码位由一个或两个 16 位的编码单元组成。所以一个 UTF-16 编码的字符需占用 2 或 4 字节。
历史上的 UTF-16
在 1980 年代后期时,出现了 通用字符集 (UCS) 。当时的设想是使用 2^16=65536 个码位,二字节编码来替换已有的单字节编码(ISO-8859)。
当时有两组人马在进行 UCS 的相关设计。分别是 ISO-10646 标准 和 Unicode 联盟。
早期的这个 65536 个码位的编码就被称为 Unicode,但现在已被称为 “UCS-2”。
但是后来 65536 个码位明显不够用了。IEEE 就整出了一个占 31 位的编码 UCS-4 (即 UTF-32)。在这个新的编码中,每个字符需要占用 4 个字节。Unicode 联盟抵制了这个编码,因为它浪费了很多不必要的存储空间。
于是作为折中方案的 UTF-16 就是在这个阶段被设计出来的 (1991-1995期间,第一版的 UTF-16 仅由 16 位编码)。UTF-16 的二字节编码就可以完整的表示当时 UCS-2 的全部码位。
UTF-16 编码规则
UTF-16 编码字节分布
| 字节数 | 最低码位 | 最高码位 | 16 位编码 1 | 16 位编码 2 |
|---|---|---|---|---|
| 2 | U+00000000 | U+0000D7FF | xxxxxxxx xxxxxxxx | - |
| 2 | U+0000E000 | U+0000FFFF | xxxxxxxx xxxxxxxx | - |
| 4 | U+00010000 | U+0010FFFF | 110110xx xxxxxxxx | 110111xx xxxxxxxx |
UTF-16 代理
不知大家是否还记得 Unicode 的 BMP 里面有一段码位没有分配给字符,而是分配给了 UTF-16 作为代理(surrogates)。这段码位即是上表中 BMP 未分配字符的码位段 U+D800-U+DFFF。
再来数下 4 字节编码的 UTF-16,其中留给码位用的 “x” 其实只有 20 位。但 Unicode 中最大的码位 U+10FFFF,需要占用 21 位才能完整表达。所以 UTF-16 的 4 字节编码需要某种适配才能表达完整的 Unicode。
Unicode 超出 BMP 的码位范围是 U+10000-U+10FFFF。之间共有 0x10FFFF-0x010000=0xFFFFF 个码位。这段码位则需要 20 位来完整表示。
0x D8 00 - DF FF = 0b 11011000 00000000 - 11011111 11111111 这一段恰好与 4 字节的 UTF-16 编码的两个字节的前缀部分冲突。所以 Unicode 的这段码位就相当于被 UTF-16 “占用"了。
于是乎,BMP 段的码位 U+D800-U+DFFF 就作为 “UTF-16 代理” 来使用了。 超过 BMP 部分的码位会用下列步骤转换为 4 字节的 UTF-16 编码:
- 原码位减去
0x10000,得到新的值占用 20 位,范围是0-0xFFFFF。 - 将新值分成以 10 位为一个单位分成两部分。前部分称为高位代理(high surrogate),现称前导代理(lead surrogate);后部分称为低位代理(low surrogate),现称后尾代理(trial surrogates)
- 前导代理加上
0xD800 (0b11011000 00000000),结果范围在0xD800-0xDBFF (0b11011000 00000000-0b11011011 11111111)内;后尾代理同理,加上0xDC00 (0b11011100 00000000),结果范围在0xDC00-0xDFFF (0b11011100 000000-0b11011111 11111111)`。 - 最后,两个结果 16 位的结果拼起来称为了一个 32 位的最终 UTF-16 编码结果。

字节顺序
上表出现了两个新的东西 BE (big-endian) 和 LE (little-endian)。这个是 字节顺序 (Endianness) 。BE 的含义是,最高有效字节存储在最小的内存地址,最低有效字节存储在较大内存地址。LE 则反之。
提到了字节顺序,就要提到字节顺序标记 BOM (Byte Order Mark)。
UTF-16 的 BE 的 BOM 是 0xFE FF。
UTF-16 的 LE 的 BOM 是 0xFF FE。
UTF-8 也有 BOM: 0xEF BB BF,但是 Unicode 不建议使用。这个 BOM 编码是从 0xFEFF 码位编码而来的。
0xFEFF = 0b 11111110 11111111
从低位开始,每次取 6 位,可得:
1111 111011 111111
最高的一组只占 4 位,且分非 3 组。则 3 字节编码前缀 1110 可满足条件,可得其 UTF-8 编码为:
0b 11101111 10111011 10111111
=0x EF BB BF
UTF-32 (UCS-4)
UTF-32 编码的每个字符都占用 4 字节。可以直接表示 Unicode 的所有码位。
已被 Unicode 移除的编码
UTF-1
UTF-1 目前已废弃,不再属于 Unicode 标准。它被 UTF-8 所取代。
UTF-1 的一些缺点导致了它没有被广泛采用,很快就被 UTF-8 取代了。
- UTF-1 不是自同步的编码,导致子字符串搜索和错误恢复变得会困难
- UTF-1 使用的除数不是 2 的幂,编码转换非常慢
UTF-7
是一种有时在电子邮件中使用的7位编码,通常被认为已作废
UTF-EBCDIC
超纲了超纲了,有兴趣自行了解。
UCS (Universal Coded Character Set, 通用字符集)
UCS-2
定长二字节字符编码,类似 UTF-16 的二字节编码部分
UCS-4
定长四字节编码,类似 UTF-32
最后的题外话
提一下 Base 编码。
Base 编码不属于上面提到的字符编码。恰恰相反,Base 编码属于一种 二进制转文本编码 (Binary-to-text encoding) 。它是用来将二进制数据编码为可打印字符,其作用与字符编码是“几乎”相反的。
常见的编码有:
编码的类型有太多太多种了, 其产生的根源都是人类为了让数据能够更高效的从人类可读和机器可读之间更加高效"转译”, 更加节省空间而设计的. 凝聚了很多人类精巧的思考成果. 如果日后还有机会的话, 还能继续往这个方向聊聊哈哈.