LOADING
1173 字
6 分钟
Unicode编码的结构和原理
2025-10-25
2026-01-20

什么是Unicode?#

Unicode在中文里叫做万国码,国际码。顾名思义,Unicode对全世界的文字系统进行了整理、编码,使得全球的计算机在文字编码上有了统一的标准。

我们知道,世界上不同的国家语言不同,因而组成文字的字符也不同,为了将自己的语言存入计算机里面,就有了五花八门的编码方式,而Unicode为了统一全世界的编码方式,将全世界的语言系统进行了整理编码。

Unicode开始制定的时候,计算机的存储容量大大的发展了,于是ISO便规定用2个字节也就是16位来表示一个字符,同样的Unicode任然保持ASCII里面的那些字符,只是将8位扩充为了16位。

UTF#

Unicode只是规定了字符的编号,如汉字”一”的编号是”4E00”,如果用每个字符的编号对应的二进制进行储存,那就比较浪费空间了(并不是所以字符都要16位表示)出于节省空间的目的,对 Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicod转换格式(Unicode Transformation Format,简称为UTF)。

UTF-8#

本文使用UTF-8为例子

UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无需或只进行少部分修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。摘自百度百科

前缀码#

UTF-8一种针对Unicode的可变长度符编码,可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码,属于Unicode标准的一部分。而实现这一效果的主要是依靠前缀码这种编码要求。

前缀码是什么呢?前缀码是指任何一个编码都不能作为另一个编码的前缀(开头部分),能确保解码时无歧义、无需分隔符。这样说比较难理解,举个例子:

给 3 个东西编编号,要满足 “没人的编号是别人的开头”:

  • 猫 → 编号 “1”
  • 狗 → 编号 “22”
  • 兔 → 编号 “31”

这就是前缀码 —— 不管按什么顺序读,看到 “1” 就知道是猫,看到 “22” 就知道是狗,绝不会混淆。

再看反例(不是前缀码):

  • 猫 → “1”
  • 狗 → “12”

这就不行!看到 “1”,根本不知道是单独的猫,还是狗的开头部分。

UTF-8的具体实现#

我们已经了解的前缀码的规则和作用了,那么UTF-8如何实现呢?

UTF-8的编码规则就两条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
-------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

目前看上去这个规则很难理解,现在让我们对照规则通俗的解释一下。

单字节的字符:字符的第一位为0,当计算机读取到第一位为0的就直接读取后面7位确定是哪个字符了,如果第一位不是0,计算机就开始计数,看有多少个1可以读取到0,例如11110xxx,计算机就知道除了这个在读的字节后面还有3个字节(10xxxxxx 10xxxxxx 10xxxxxx)


PS: 现在还有一个小疑问,就是为什么后面字节的前两位一律设为10,“10” 是后续字节的 “身份标识”,计算机读取时会双重校验:若后续字节不以 “10” 开头,比如混入一个以 “0” 或 “110” 开头的字节,一旦数据传输中出现错位(比如少读 / 多读 1 个字节),计算机就会彻底混乱。所以既看首字节的 “1 的个数” 确定总长度,又会检查后续字节是否都以 “10” 开头。

Unicode编码的结构和原理
http://blog.leoio.cn/posts/20251025/
作者
Leone
发布于
2025-10-25
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录