编码

133 阅读4分钟

gbk utf-8 unicode base64 Unicode ASCII这些都是什么呢?

计算机只能识别0和1这样的二进制,无法直接识别数字,英文,汉字等字符,所以需要将这些字符转换成计算能识别的二进制。一个字节由8位二进制数组成,针对不同的字符,1.应该以几个字节表示,2.应该以怎么样的0 1 组合进行转化呢?对于这个问题就引出字符集,编码方式等概念。

字符集

表示不同的字符对应怎样的0 1 组合

例如 在ASCII码中0110 0001 的组合(10进制为97)表示字母a

ascii.jpg

编码方式

对于ASCII来说,它由1个字节中的后七位二进制来表示对应的255个字符,由于表示的是一些简单的字符,所以ascii的编码方式也是单一的,直接按照字符集表对应转换即可。但是如果想要表示世界上所有的字符,如汉字。那么需要更多的字节数来表示一个字符才能保证组合不重复,例如unicode。在unicode中最高会以4字节来表示一个字符,这样又引发了一个新的问题,对于简单的字符,也以4字节的空间来表示就会很浪费空间。例如字母a 以4字节来表示: 00000000 00000000 0000000 01100001,很明显前面三个字节是没用的,只是为了进行填充来达到四个字节。为了节约空间对于unicode又延伸出了多种编码方式utf-8 utf-16等

ASCII

由一个字节表示一个字符,除了首位的0外剩下的7个二进制数能表示255个字符 (00000000 - 01111111),可成ASCII为字符集,也可以称它为编码方式

gb2312

因为ASCII表示的范围有限,不能表示汉字,中华人民共和国全国信息技术标准化技术委员会制定了新的字符集,它以2个字节来表示一个字符,包括6763个常用汉字和字符。它向上兼容了ASCII字符集,也就是说gbk的前255个字符的对应方式和ASCII是一样的,但是它的缺点是不包括除此之外其他国家的符号,如俄语符号,法语符号等。

gbk

过了些年在gb2312的基础上又增加一些汉字符号,同时也向上兼容gb2312,它的缺点依旧是不包括除此之外其他国家的符号,如俄语符号,法语符号等。

gb18030

又过了些年在gbk的基础上又增加一些汉字符号,同时也向上兼容gb2312,它的缺点依旧是不包括除此之外其他国家的符号,如俄语符号,法语符号等。

ios-8859-1

它由1个字节(8位,比ASCII多了一位)来表示字符,向上兼容ASCII,同时额外支持了希腊语,泰语,阿拉伯语,但是不支持汉字,它的优点在于:将任意的字符用ios-8859-1由完整8位表示,编码后在用其他字符集编码最终效果是一样的,因为ios-8859-1由完整8位表示,对字符编码的过程中不存在增加控制位的操作,即不会改变字符原有的01组合。

unicode

上面的字符集都存在各种各样的不兼容问题,国际标准化组织制定了一套面向全世界的字符集,最多由4字节表示一个字符。以unicode作为字符集的编码有utf-8 utf-16等

utf-8

基于unicode字符集的一种编码方式,由1 至 4 个字节来表示一个字符 UTF-8 的编码规则:

  1. 对于单字节的符号,字节的第一位设为 0,后面 7 位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的, 所以 UTF-8 能兼容 ASCII 编码,这也是互联网普遍采用 UTF-8 的原因之一
  2. 对于 n 字节的符号( n > 1),第一个字节的前 n 位都设为 1,第 n + 1 位设为 0,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码

utf-8.jpg