字符与编码
广义的编码
大家都知道计算机对于所有信息的存储都是存储的比特流,也就是在最底层只有0和1,而其能将这些01序列展示成我们能看到的多姿多彩的世界,比如图片、网页、视频等,这是因为不同的数据都有其固定的格式,计算机程序对这些比特流进行了“编码”与“解码”从而可以存储信息展示信息。从这里可以看出编码的范围涵盖很广,而在接下来要介绍的“编码”指的是将字符集进行编码。
字符集与编码
字符集
字符集是各种字符的集合,可以包括文字、数字、标点符号等各种字符。常见的字符集包括:
ASCII 美国信息互换标准编码,7位(bits)表示一个字符,共128字符
中文字符集GB2312与GBK 使用两个字符来表示一个中文字符,GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;GB2312只能表示一些常用的汉字,为了表示更多的汉字有GBK字符集,GBK能表示的汉字有2万多个。
Unicode字符集 在世界各地都有自己的编码字符集,而这些各个编码字符集之间无法相互识别,就会会出现乱码。因此国际标准组织ISO出台了一套16位的字符编码方案以总括现有的各个编码字符集, 称为Unicode。
字符集表示使用的是哪些字符,每个字符在字符集中都有唯一的表示,比如
在GB2312中,汉字通过区位码进行表示,比如“啊”字是GB2312之中的第一个汉字,它的区位码就是1601
而在Unicode中,每个字符都有一个唯一的统一码,其中“啊”字的统一码是\u554a
字符的编码
字符集的编码,则规定每个“字符”分别用一个字节还是多个字节存储,这些字节的格式是怎样的。
比如对于Unicode字符集,其实现方式有很多种比如UTF-32、UTF-16、UTF-8,经常使用的UTF-8的编码方式,具体表示如下:
Unicode字符中 0x0000 到 0x007F 范围内,所以直接去掉前面那个字节 0x00,使用其第二个字节(与ASCII码相同)作为其编码,即为单字节UTF-8编码。
Unicode字符中0x0080 到 0x07FF 范围内,转换成双字节UTF-8编码。
Unicode字符中 0x8000 到 0xFFFF 范围内,转换成三字节UTF-8编码,一般中文都是在这个范围里。
其他极少使用的语言字符使用4字节编码,比如emoji表情
对于UTF-8的编码表示:单字节以0开头;双字节编码以 110 开头;三字节编码以 1110 开头;10 开头表示多字节编码的后续字节。
所以“啊”字的统一码是\u554a,则将其编码为UTF-8格式时,使用三个字节表示所以其格式时为1110xxxx 10xxxxxx 10xxxxxx
,需要16位,而\u554a的二进制表示 (0101 0101 0100 1010)正好有16位,将其填入空位之后则表示成 11100101 10010101 10001010
所以“啊”的UTF-8编码的十六进表示就是E5958A
版权声明: 本文为 InfoQ 作者【引花眠】的原创文章。
原文链接:【http://xie.infoq.cn/article/016be922c3ef4b39927acf263】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论