ASCII、unicode、utf

作者: 漓漾li | 来源:发表于2019-02-14 14:07 被阅读0次

    机器只认识10,所以人为了能用自己的语言与机器交互,规定出了各种二进制与语言字符的对应关系,即编码

    ASCII编码

    最早普及的编码集为ASCII码,它用一个字节(8位二进制)规定了128个字符的编码(首位二进制统一为0,2^7个),主要都是英文字符。

    ASCII编码

    英语使用ASCII中规定的128个字符就足够了,但是却远远不足以表示其他语言,即使是利用上首位的二进制,于是出现了各国语言的编码,比如支持简体中文的GB2312,支持繁体中文的BIG5。使得在解析文件时还需要注意它的编码格式,否则就会乱码,因为不同的编码对二进制会有不同的解读。

    语言 字符集 正式名称
    英语、西欧语 ASCII,ISO-8859-1 MBCS 多字节
    简体中文 GB2312 MBCS 多字节
    繁体中文 BIG5 MBCS 多字节
    简繁中文 GBK MBCS 多字节
    中文、日文及朝鲜语 GB18030 MBCS 多字节
    各国语言 unicode,UCS DBCS 宽字节

    unicode码在这种背景下诞生了,它统一了全世界的语言符号。使用U+****表示,*为16进制数.

    • Unicode不是一次性定义的,而是分区定义。每个区可以存放65536个(2^16 )字符,称为一个平面(plane)。目前,一共有17个(2^5 )平面,也就是说,整个Unicode字符集的大小现在是2^21。
    • 最前面的65536个字符位,称为基本平面(BMP),它的码点范围是从0 ~ 2^16-1,写成16进制就是U+0000 ~ U+FFFF。所有最常见的字符都放在这个平面,这是Unicode最先定义和公布的一个平面。
    • 剩下的字符都放在辅助平面(缩写SMP),码点范围从U+010000 ~ U+10FFFF

    UTF

    unicode在实际应用中是有问题的,比如对于多字节字符,如何让机器知道这是一个字符而不是多个字符,所以在与机器实际交互中,需要将unicode转换格式后使用,这就出现了UTF(UTF,是UnicodeTransformationFormat的缩写,意为Unicode转换格式),包括utf-32、utf-16、utf-8等等。

    utf-32

    规则:每个码点使用四个字节表示,字节内容一一对应unicode码点

    unicode 中 'a'为 u+61
    utf-32转化后为 00000061
    

    缺点:浪费空间。如果一个全是英文的文件,每个字符都会浪费三个字节的空间,因为每个英文字符一个字节就可以表示。

    utf-16

    规则:

    Unicode范围 UTF-16编码方式
    U+000~U+FFFF 2 字节存储,编码后等于Unicode值
    U+10000~U+10FFFF 4 字节存储。1.将Unicode值减去(0x10000),得到20bit长的值。再将Unicode分为高10位和低10位。 UTF-16编码的高位是2 Byte,高10位Unicode范围为0-0x3FF,将Unicode值加上0XD800,得到高位代理(或称为前导代理,存储高位);低位也是2 Byte,低十位Unicode范围一样为0~0x3FF,将Unicode值加上0xDC00,得到低位代理(或称为后尾代理,存储低位)
    utf-8

    规则:

    1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
    2. 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
    Unicode符号范围 UTF-8编码方式
    0000 0000-0000 007F 0xxxxxxx
    0000 0080-0000 07FF 110xxxxx 10xxxxxx
    0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
    0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    相关文章

      网友评论

        本文标题:ASCII、unicode、utf

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