字符集和字符编码

2022-05-28  本文已影响0人  浙南旧事

常常会把字符集和字符编码混起来。
下面是一些常用的字符集:
ASCII字符集
GB2312字符集
GBK字符集
GB18030字符集
UCS字符集(ISO10646)
UNICODE字符集
ASCII,GB2312,GBK这些字符集与编码有一一对应的关系,因此也经常说ASCII编码,GB2312编码等。
UCS字符集与UNICODE字符集是兼容的,但他们的编码方式有所不同。

UCS字符集(Universal Multiple-Octet Coded Character Set)包含128个group,每个group包含256个plane,每个plane包含256个row,每个row包含256个cell。
ISO10646规定每个plane的最后两个编码点位不用(0xfffe,0xffff),因此总的点位数就等于:
128 x 256 x (256 x 256 - 2) = 2,147,418,112
UCS字符集的编码方式有两种,分别是UCS-4和UCS-2,它们都是定长编码,可以看做是跟字符集本身的点位有一一对应的关系。
UCS-4固定用4字节表示UCS字符集。为了兼容UNICODE,ISO承诺将不会为超出0x10FFFF的UCS-4编码赋值。
UCS-2固定用2字节表示UCS字符集。它只能表示字符集中group0,plane0的内容。为了兼容UNICODE,0xD800-0xDFFF之间的点位未使用。

UNICODE字符集包含17个plane,每个plane包含65536个点位。plane0称为基本多文种平面(BMP),码点范围是U+0000-U+FFFF。剩余16个plane称为辅组平面(SMP),码点范围是U+010000-U+10FFFF。
从点位上来说,UNICODE字符集与UCS字符集兼容。
UNICODE字符集的编码方式有三种,分别是UTF-32,UTF-16,UTF-8。
UTF-32是定长编码,固定使用4字节,可以看做是跟字符集本身的点位有一一对应的关系。UTF-32其实跟UCS-4是一样的。

UTF-16和UTF-8是不定长编码,也不是与点位直接对应,而是有一个真正"编码"的过程。
UTF-16对BMP和SMP有不同的处理方式。对BMP,使用2字节,直接一一对应即可,注意不使用BMP中的0xD800-0xDFFF点位。
对SMP,使用4字节。SMP的码点范围是0x010000-0x10FFFF,减去0x010000就是0x0-0xFFFFF,用20bit即可表示。用这20bit中的前10bit加上0xD800,就得到UTF-16 4字节编码中的前两个字节(范围是0xD800-0xDBFF)。
用后10bit加上0xDC00,就得到UTF-16 4字节编码中的后两个字节(范围是0xDC00-0xDFFF)。
因此,解码UTF-16时,碰到0xD800-0xDBFF打头,就可知道这是4字节编码,是SMP中的字符,碰到0x0-0xD7FF或0xE000-0xFFFF打头,就可知道这是2字节编码,是BMP中的字符。

UTF-8编码方式就是真正的不定长了,对不同点位分别使用1,2,3,4字节进行编码。
1 000000-00007F 0xxxxxxx
2 000080-0007FF 110xxxxx 10xxxxxx
3 000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx
4 010000-10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面是编码示意图(先不考虑大小端):


bmp_smp.jpg

BOM(Byte Order Mark)字面意思是字节序,但也被用于表示编码方式。
ucs-2(及utf-16) big-endian的BOM是fe, ff。
ucs-2(及utf-16) little-endian的BOM是ff, fe。
utf-8的BOM是ef, bb, bf。

用微软记事本保存文件时,它支持4种编码方式:
ANSI
Unicode
Unicode big endian
UTF-8
这里的Unicode其实是指utf-16编码方式(因此支持SMP上的字符)。
除了ANSI,选择另外三种编码方式时,都会自动在文件头部加入BOM。
ANSI就是英文字符用ASCII,中文字符用GB2312。这就是多字节字符集MBCS或双字节字符集DBCS。

Notepad++支持5种编码方式:
ANSI
UTF-8 without BOM
UTF-8
UCS-2 Big Endian
UCS-2 Little Endian
(注意UCS-2不支持SMP)

判断一个文件的字符集或编码方式时,可以综合使用file -i及iconv工具。

上一篇下一篇

猜你喜欢

热点阅读