字符集
字符集,从字面意思来讲,就是某些特定字符的集合。
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 字符集中的码点),但有些时候却不是这样。
比如 Unicode 字符集。
Unicode 字符集包含了很多字符。
Unicode 的码点可以分成 17 个代码级别(code plane)。 第一个代码级别称为基本的多语言级别(basic multilingual plane ),码点从 U+0000
到 U+FFFF
,其中包括经典的 Unicode 代码;其余的 16 个级别码点从U+10000
到 U+10FFFF
, 其中包括一些辅助字符(supplementary character)。
1 | 1 个基本的多语言级别 |
要表示从 U+0000
到 U+10FFFF
的 17 * 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)