/ 博客列表 / Unicode

Unicode

Unicode 草述

Unicode(或者正式一点,叫 Unicode 标准)是一套信息技术标准,包含字符集、编码方案等。

一个 Unicode 码点(code point)是一个数字,它对应一个字符。比如 65 对应大写拉丁字母 A,20013 对应汉字

Unicode 字符集简称 UCS(Unicode Character Set)。UCS-4 用 4 个字节(32bit)编码一个字符。

在 Unicode 标准中,一个平面(plane)是 65536(2162^{16})个一组的连续码点。目前有 17 个平面,序号是 0-16。

第 0 平面也叫 Basic Multilingual Plane,简称 BMP。它包含了几乎所有现代语言中的字符和一大堆符号。在 Unicode 14.0 中,BMP 包含 164 个区块。比如:

  • 0000-007F: 对应 ASCII 字符
  • 0370-03FF: 对应希腊及科普特字符
  • 4E00-9FFF: CJK统一表意符号。这里 CJK 指 Chinese、Japanese 和 Korean。常见汉字就在这个区块中。

第 1 平面也叫 Supplementary Multilingual Plane,简称 SMP。Emoji、麻将、扑克牌、音符等字符就被定义在这个平面中。

UTF-8

UTF-8 是最常用的 Unicode 编码方式。UTF 是Unicode 字符集转换格式(UCS Transformation Format)的缩写.

UTF-8 以字节为单位编码,它对不同范围内的字符使用不同长度的编码。UTF-8 编码格式对应表如下:

字节格式实际编码位码点范围
10xxxxxxx70 ~ 127
2110xxxxx 10xxxxxx11128 ~ 2047
31110xxxx 10xxxxxx 10xxxxxx162048 ~ 65535
411110xxx 10xxxxxx 10xxxxxx 10xxxxxx2165536 ~ 2097151

由此表可以看出,

  • 对于前 128 个字符,UTF-8 编码与 ASCII 编码完全相同
  • 用三个字节,就可以表示 BMP 中的全部字符了

小作业:写一个 UTF-8 的编码器/解码器。😁

MySQL

MySQL 早期为了节省存储空间(?),用最多三个字节存储 utf-8 编码字符。这意味着 MySQL 中的 utf8 只能存储 BMP 字符。字符串中要是包含 emoji 等特殊字符,utf-8 就无能为力了,这时应该使用 utf8mb4。请各位注意。

MySQL 中 utf8 是 utf8mb3 的别名。

参考