Unicode、UTF-8、GBK编码

热点 139 0

计算机只能识别都是由0和1组成的字符,为了能让字符正常显示在屏幕上,需要对字符进行编码。

ANSI编码并不是某一特定编码,与系统环境区域有关,有中文区域环境下是GBK编码,在英文区域环境下是ASCII编码。为了使计算机支持多种语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等编码标准。使用 2 个字节来代表一个字符的各种延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

Unicode、UTF-8、GBK编码

1,ASCII:每个字母或符号占1Byte(8bits),并且8bits的最高位是0,对英语字符与二进制位之间的关系做了统一规定,这被称为 ASCII 码。ASCII编码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。有一些编码把8bits最高位为1的后128个值也编码上,1Byte可以表示256个值,这属于扩展的ASCII,并非标准ASCII,通常所说的标准ASCII只有前128个值。

ASCII码表

2,GB2312、GBK、GB18030编码:GB全称GuoBiao国标,GBK全称GuoBiaoKuozhan国标扩展。GB18030编码兼容GBK,GBK兼容GB2312。

GB2312:最早一版的中文编码,每个字占据2Bytes,由于要和ASCII兼容,那这2Bytes最高位不可以为0了(ASCII有冲突),在GB2312中收录了6763个汉字以及682个特殊符号。

GBK:由于GB2312只有6763个汉字,于是GBK在不和GB2312、ASCII冲突(即兼容GB2312和ASCII)的前提下,用每个字占据2Bytes的方式又编码了许多汉字,表示的汉字达到了20902个,另有984个汉语标点符号、部首等。值得注意的是这20902个汉字还包含了繁体字,但是该繁体字与台湾Big5编码不兼容。

GB18030:GBK只用2Bytes表示一个字已经不够(2Bytes最多只有65536种组合,然而为了和ASCII兼容,最高位不能为0)。多出来的汉字使用4Bytes编码。我国在2000年和2005年分别颁布的两次GB18030编码,其中2005年的是在2000年基础上进一步补充。GB18030编码的中文有七万多个汉字了,甚至包含了少数民族文字。GBK和GB2312是2Bytes,GB18030比GBK多出来的字是4Bytes。

3,Latin1编码(ISO-8859-1编码):在ASCII基础上又充分利用了后面那128个值,是单字节编码方式,最多只能表示256个字母或符号,并且前128个和ASCII完全吻合,将1个字节的256个值全部占满了。

ISO-8859-1

4,Unicode:称为单一码,将世界上所有国家的字符编码进行统一的编码,编码范围是 0x0000 - 0x10FFFF。Unicode是一个字符集,给所有的字符分配一个码值,只规定了每个符号的二进制值。Unicode 只是字符集码点,而UTF-8、UTF-16、UTF-32 才是真正的字符编码规则。

5,UTF-8(8bit Unicode Transformation Format):是一种变长的编码方式,使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8 编码如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。对于英语字母,UTF-8 编码和 ASCII 码是相同的。

utf-8编码

6,UTF-16编码:也是一种变长字符编码,将字符编码成2字节或者4字节。对于 Unicode 码小于 0x10000 的字符,使用 2 个字节存储,并且是直接存储 Unicode 码,不用进行编码转换;对于 Unicode 码在 0x10000 和 0x10FFFF 之间的字符,使用 4 个字节存储,这 4 个字节分成前后两个字节,前面两个字节的前 6 位二进制固定为 110110,后面两个字节的前 6 位二进制固定为 110111, 前后部分各剩余 10 位二进制表示符号的 Unicode 码 减去 0x10000 的结果;大于 0x10FFFF 的 Unicode 码无法用 UTF-16 编码。

7,UTF-32:每个码点都用4字节进行存储,存储的就是unicode对应的值,没有进行编码直接存储的

8,UTF-8、UTF-16、UTF-32 之间转换:UTF-8、UTF-16、UTF-32 是 Unicode 码表示成不同的二进制格式的编码规则,反之,通过这三种编码的数据,也能获得相对应的 Unicode 码,有Unicode 码,按照 UTF-8、UTF-16、UTF-32 的编码方法就能转换成任一种编码。

注:Unicode属于字符集,不属于编码,UTF-8、UTF-16等是针对Unicode字符集的编码。

附:Little endian 和 Big endian:存储第一个字节在前Big endian,第二个字节在前就是Little endian。UCS-2 (Universal Character Set codeed in 2 octets)格式可以存储 Unicode 码。Unicode 规范定义,每一个文件的最前面加入一个表示编码顺序的字符,这个字符叫做"零宽度非换行空格"(zero width no-break space),用FEFF表示,如果一个文本文件的头两个字节是FE FF,就表示该文件采用Big endian方式;如果头两个字节是FF FE,就表示该文件采用Little endian方式。

BOM:BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM,不含 BOM 的 UTF-8 才是标准形式。UTF-8和带BOM的UTF-8的区别就是有没有 BOM,即文件开头有没有 U+FEFF。UTF-8 的网页代码不应使用 BOM,否则常常会出错。

标签: utf 8

抱歉,评论功能暂时关闭!