美文网首页
字符集和字符编码

字符集和字符编码

作者: 浙南旧事 | 来源:发表于2022-05-28 15:11 被阅读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工具。

    相关文章

      网友评论

          本文标题:字符集和字符编码

          本文链接:https://www.haomeiwen.com/subject/qevgprtx.html