ASCII,ANSI,Unicode,UTF-8编码区别
前言
在工作的过程中, 时常都会碰到字符编码的问题, 比如最常用的UTF-8码。 从IED要设置为UTF-8码到网上下载数据选择UTF-8码, 编码问题总会关系到数据能否正常展现。
在很早前刚入坑的时候, 老师总会告诉我们打开IDE前得先设置字符编码为UTF-8无BOM格式, 当时也不理解这样设置的目的, 稀里糊涂的一直到今。
ASCII码
对于一个phper而言, ASCII码的接触不算太多, 或许是php的两个ASCII码转换函数chr,ord让我们了解到ASCII码。那ASCII码究竟是什么样的存在呢?
ASCII全称American Standard Code For Information Interchange(美国信息交换标准码), 是20世纪60年代美国制定了一套字符编码, 对英语字符与二进制位之间的关系,做了统一规定。
对于二进制绝大多数同学应该有所了解, 除了在生活中我们一直计数使用的十进制外还有二进制、十六进制等的存在, 相对于十进制的逢十进一, 二进制、十六进制就如其名, 分别逢二、逢十六进一。 比如十进制的2在二进制表现形式为00000010, 10为00001010.
在计算机中数据是以二进制的形式存在的, 一个二进制位(最小单位bit)只包含0或1两个数字形式。而8个二进制位组成一个字节(byte), 从00000000到11111111 ,存在着256种位数组合。
而ASCII码就是在1字节的基础上, 由不同二进制位的组合对应不同英语字符。比如 0110 0001 对应 a, 0110 0010 对应 b. 加上一些符号的对应, 这套ASCII码总共有128个字符的编码, 从0到127, 因为只用到了7个二进制位, 最高1个二进制位规定为0. 附上ASCII表
随着计算机需要显示更多的字符, 20世纪80年代在原先ASCII码的基础上扩展了ASCII码(EASCII), 从原先的128个扩展到256个字符编码, 扩展的字符为特殊符号字符、外来语字母和图形符号。EASCII表
ANSI编码
在英语中可用1字节(8个二进制位)储存所有英文字符及常用符号,而其他语言可能使用字符众多, 比如拥有十多万字的汉字,ASCII码显然已经不够用, 于是就设计让汉语、日语及朝鲜语等可以使用数个字节来显示的编码。比如简体中文文的GB2312码, 繁体中文的Big5码。而ANSI编码并不是当当指一编码, 而是对GB2312,Big5这一系列编码的总称。
Unicode编码
ANSI编码虽然能解决不同字符的数据与二进制数字对应, 但是同一个二级制数字可能在不同编码中代表着不同的字符。 因此我们在打开文本的时候往往非常注意字符编码, 不然打开的文件可能就是一堆乱码。 那有没有一个编码能够包含世界所有的语言字符呢? 这时候Unicode编码就应运而生了。
在20世纪90年代, Unicode编码发行了它的第一个版本(第二版中加入中文), 这个版本中加入二十多种语言字符。Unicode的大小范围从十六进制的U+0000到U+10FFFF ,共有1,114,112个数字可用来映射字符, Unicode的数字空间可以划分为17个平面(plane),每个平面包含65,536个数字, 每个平面的数字可表示为从U+xx0000到U+xxFFFF, 其中xx表示十六进制值从00到16,共计17个平面, 其中编码从U+0000至U+FFFF被称为基本多文种平面(Basic Multilingual Plane, BMP)。而Unicode编码也是向下兼容ASCII码的, 比如ASCII码中的a与Unicode编码码中的a同为 0110 0001, 都在基本平面中。最后附上中文的Unicode对应表对应表,汉字对应表
UTF-8码
Unicode编码虽然定义了字符与二进制数字的对应关系, 却没有定义它的实现, 而UTF-8就是将Unicode所定义的字符数字对应关系付诸实践。UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码, 它可以用来表示Unicode标准中的任何字符。UTF-8使用一至四个字节为每个字符编码。
UTF-8码有四个特点:
- 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
- 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
- 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
- 其他极少使用的Unicode 辅助平面的字符使用四至六字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节)。
UTF-8的编码规则:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
- 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
参考
字符编码笔记:ASCII,Unicode和UTF-8
UTF-16与UCS-2的区别
UTF-8 维基百科
ASCII 维基百科
EASCII 维基百科
Unicode 维基百科