字符集和字符编码

字符集

字符集,从字面意思来讲,就是某些特定字符的集合。

ASCII 字符集包括了大小写英文字母、数字、英文标点符号和控制字符等在内的 128 个字符;

GBK 字符集除了包括 ASCII 字符集中的所有字符,还包括了汉字和中文标点符号;

Unicode 字符集除了包括 ASCII 字符集中的字符,还包括了中文字符、日文字符等各种各样的字符。

字符集除了指定其中包含的字符,还为每个字符分配了一个唯一的代码值(通常是数字)来代表该字符。

这个代码值就称之为该字符在该字符集中的码点。

在 ASCII 字符集中用 65 来表示字符 A ;Unicode 字符集中用 U+0041 来表示字符 A 。(其中 U+ 是 Unicode 的固定前缀,0041 是一个 16 进制数字。)

另一方面,也可以说字符A 在 ASCII 字符集中的码点是 65,在 Unicode 字符集中的码点则是 U+0041

编码表应该是字符集的另一种叫法?

ASCII 字符集:
ASCII 字符集

字符编码

字符编码:将字符按照一定的规则,转换成一个二进制数字,保存到计算机中。以及一个二进制数字,通过怎样的规则,转换成一个对应的字符。

在某种字符集中,将一个字符保存到计算机中时,由于一个字符对应了一个唯一的码点,所以通常情况直接保存该码点即可(比如 ASCII 编码就直接保存了字符在 ASCII 字符集中的码点),但有些时候却不是这样。

比如 Unicode 字符集。

Unicode 字符集包含了很多字符。

Unicode 的码点可以分成 17 个代码级别(code plane)。 第一个代码级别称为基本的多语言级别(basic multilingual plane ),码点从 U+0000U+FFFF ,其中包括经典的 Unicode 代码;其余的 16 个级别码点从U+10000U+10FFFF, 其中包括一些辅助字符(supplementary character)。

1
2
3
4
5
6
7
8
9
10
1 个基本的多语言级别
U+0000 ~ U+FFFF (65536 个)

剩余的 16 个级别
U+10000 ~ U+1FFFF
U+20000 ~ U+2FFFF
...
U+E0000 ~ U+EFFFF
U+F0000 ~ U+FFFFF
U+100000 ~ U+10FFFF

要表示从 U+0000U+10FFFF17 * 65536 = 1,114,112 个字符,需要 3 个字节。

虽然 Unicode 字符集包括了这么多的字符,但是我们常用的字符却只占其中的一小部分。

以英文字符为例,用 1 个字节来表示就能比用 3 个字节来表示节省 2/3 的空间。

这对于主要使用英文的西方国家来说,是一个不容忽略的空间。

所以就有了 UTF-8、UTF-16 等不同的编码方式来将 Unicode 字符集中的字符编码成占据不同字节大小的数字存储到计算机中。

UTF-8 编码使用 1 ~ 3 个字节来表示一个 Unicode 字符:

  • 1 个字节可以表示 2^7 = 128 个字符,与 ASCII 字符集对应。
  • 2 个字节可以表示 2^(5+6) = 2048 个字符。
  • 3 个字节可以表示 2^(4+6+6) = 65536 个字符。
Byte 1 Byte 2 Byte3
0xxx xxxx
110x xxxx 10xx xxxx
1110 xxxx 10xx xxxx 10xx xxxx

Ref

字符集和字符编码(Charset & Encoding)– 吴秦(Tyler)

字符编码笔记:ASCII,Unicode 和 UTF-8 – 阮一峰

十分钟搞清字符集和字符编码 – cenalulu