在上一篇文章中,我们了解了数字字符的起源ASCII 码。虽然ASCII很出色,但128个字符的限制显然不足以容纳全球所有语言。

今天我们将讨论超越ASCII的限制,整合包括韩文、汉字、阿拉伯文和表情符号在内的全球所有字符的巨大承诺Unicode


在互联网初期,当我们访问其他国家的网站时,常常会看到字符破损、屏幕上布满了类似这样的符号,这种现象被称为“莫基巴克(Mojibake)”。

原因很简单。各个国家和语言使用不同的字符集编码。同样的二进制数据,有的计算机会解读为“这是韩文”,而另一些则解读为“这是西欧语言”。

为了平息这场数字巴别塔的混乱,救世主Unicode应运而生。

环绕全球,各种不同语言的字符

1. Unicode是什么?



Unicode是“Universal Code”的缩写,是一项国际标准,为全球所有字符分配唯一的编号(Code Point)

如果ASCII代码的编号从0到127,Unicode则将这个范围几乎无限制地扩展。目前,Unicode已注册超过14万个字符,其中不仅包括现存的语言,还有古代象形文字、乐谱符号,以及我们每天使用的表情符号(Emoji)。

代码点 (Code Point)

Unicode通过给每个字符附上以U+开头的十六进制编号进行管理。

  • 拉丁字母 'A': $U+0041$ (与ASCII码相同)

  • 韩文 '가': $U+AC00$

  • 汉字 '日': $U+65E5$

  • 表情符号 '😀': $U+1F600$

现在,全球所有计算机在接收到$U+1F600$这一信号时,无论语言设置如何,都会想到同样的笑脸(😀)。

2. Unicode和UTF-8是同一个东西吗?

这是很多人容易混淆的部分。“Unicode”与我们常见的“UTF-8”并不相同。理解它们之间的关系是今天文章的重点。

  • Unicode: 是将字符与数字联系在一起的“地图”(Map)。(抽象的约定)

  • UTF-8 (编码): 是将那个数字实际存储在计算机内存中的“包装方式”(Method)

如果将Unicode看作是为全球所有物品分配ID编号的“目录”,那么UTF-8则是为了将这些物品装载到卡车上而进行包装的“技术”。

3. 为什么UTF-8成为标准?



将Unicode字符存储在计算机中的方式有UTF-16、UTF-32等多种选择。然而,目前全球98%以上的网络使用的是UTF-8

UTF-8之所以能够胜出的原因在于其“可变长度(Variable Width)”的出色效率,根据字符类型分配不同的存储空间(字节)。

字符类型 示例 Unicode编号 UTF-8存储大小 特点
基本拉丁字母 A $U+0041$ 1字节 与ASCII码100%兼容
中东/欧洲语言 Ω, ¶ $U+03A9$ 2字节 拉丁扩展和希腊语等
CJK (汉字) 한, 中, あ $U+D55C$ 3字节 大多数亚洲字符
表情符号/古语言 🚀 $U+1F680$ 4字节 超越平面的字符

UTF-8的优点

  1. 与ASCII兼容性: 存储英文文档时,与ASCII码的容量完全相同,完全兼容现有系统。

  2. 高效性: 常用的英文/数字使用1字节存储,复杂的字符则使用更长的存储,从而优化总体容量。

4. 开发者在处理Unicode时的注意事项

与仅由1字节(ASCII)构成的时代不同,在Unicode环境中,计算“字符串的长度”时需要特别注意。

  • 从内存(字节)角度来看:'A'是1,'한'是3。

  • 从字符的角度来看:'A'也是1个字符,'한'也是1个字符。

如果按照过去的方式切割或存储字符串,可能会导致多字节字符(韩文、汉字等)中间被截断,数据损坏。因此现代编程语言通常内置了能够自动支持这类Unicode处理的库。


总结

  1. Unicode: 为全球所有字符分配唯一编码(Code Point)的国际标准协议。

  2. 目的: 整合各语言之间不同的编码方式,从而解决字符破损(莫基巴克)现象。

  3. UTF-8: 最有效地存储Unicode的方式。英文占1字节,韩文/中文/日文字符占3字节进行可变存储。

Unicode不仅仅是一个技术标准,它也是没有语言障碍的全球信息交流的数字时代最具包容性的基础设施


🚀 下一篇文章预告

既然我们了解了文本的存储方式(编码),接下来就该探讨如何更聪明地处理数据了。“图像如何以0和1进行存储?” 我们将非常简单地解读像素、分辨率以及RGB颜色的原理。

👇 推荐阅读的文章


如果您觉得这篇文章有帮助,请不要错过其他IT技术的故事,欢迎订阅!