一文秒懂编码那些事儿

编码有两个大类:
非Unicode编码:ASCII、SO 8859-1、Windows-1252、GB2312、GBK、GB18030和Big5
Unicode编码:世界上所有的字符都统一分配了一个数字编号,大概有110多万
ASCII 只考虑了美国最初的需求,128个字符,用一个字节(8位)来表示,将最高位设置为0,剩下的7位正好可以表示128个ASCII,ASCII 规定了0~127的每个数字代表了的字符

ASCII码对于美国来说是够用了,但是对于其他国家不够用,于是各个国家的计算机厂商就发明了各种各样的编码方式来表示自己国家的字符,为了保持与ASCII码的兼容性,同时由于ASCII 将最高位置为0,其他的计算机厂商就将自己国家的编码的最高位设置为1。在这些扩展的编码中,在西欧国家流行的是ISO8859-1和Windows-1252,在中国是GB2312、GBK、GB18030和Big5

Windows-1252和ISO 8859-1基本是一样的,只有部分不一样,加入了欧元符号以及一些其他的常用的字符,可以认为ISO 8859-1已经被Windows-1252取代(都是一个字节来表示一个字符)

GB2312是中文的第一个标准,规定了简体中文常见字符,包括约7k个汉字和一些罕用词和繁体字,固定使用两个字节来表示一个汉字,最高位都是1,如果是0则认为是ASCII字符

GBK 向下兼容GB2312,GBK增加了14k多个汉字,所以总共有21k 汉字,包括繁体字,也同样是用固定的两个字节来表示一个汉字的

GB18030 向下兼容了GBK,增加了55k 多个汉字,所以总共有76k汉字,包括了很多少数民族字符以及中日韩统一字符,由于两个字节最多表示 2的16次方=65535 个字符,所以两个字节已经不能完全表示GB18030的所有字符,因此GB18030 使用变长编码,有的字符是两个字节,有的字符是4个字节

Big5 是针对繁体中文的,广泛用于我国台湾地区和我国香港特别行政区等地,Big5包括13k多个繁体字,和GB2312类似,以固定两个字节来表示一个字符

如果文本里的字符都是ASCII码字符,那么使用上面的任何一种编码都是一样的,因为ASCII是基础,所有的编码都兼容ASCII,如果最高位是1,除了GB2312、GBK、GB180相互兼容以外,其他编码都是不兼容的,即使Big5和GB18030都能表示繁体,表示方式也是不一样的
非Unicode 编码不仅规定了能表示哪些字符,也规定了每个字符对应的二进制是什么

【乱码】即指定的两种编码方式不兼容,编码转换时出现解析错误

非 Unicode 编码计算机厂商都只考虑了自己国家甚至自己厂商的字符和编码,导致出现了太多的编码且相互不兼容
Unicode 就出现了,Unicode 给世界上所有的字符都分配了一个唯一的数字编号,这个数字编号一般写成16进制,在前面加U+,但它并没有规定对应的二进制是什么

编号如何对应二进制表示呢?
主要就有UTF-32、UTF-16、UTF-8

UTF-32:用固定四个字节表示,比较浪费空间
UTF-16:用变长字节表示,常用字节用两个字节表示,增补字节用四个字节表示,也就是任何一个字符都是需要至少两个字节表示的,对于美国和西欧国家而言(他们的字符都可以用一个字符表示完)还是很浪费的
UTF-8:用变长字节表示,每个字节使用的字节书和其Unicode编号的大小有关,编号小的字符使用的字节就少,使用字节数有1~4个不等,UTF-8是兼容ASCII码,对于大部分中文而言,一个中文字符需要用三个字节来表示

小知识:
如何由Unicode编号来对应二进制?
1.首先将编号看作整数,并转化为相应的二进制
2.将二进制从右到左一次填入对应的二进制格式X中,填完后如果对应的二进制格式还有没填的空,就置为0

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 常见编码 文本编码 常见的文本编码方法有:ANSI(多字节)的ASCII编码、GB2312、GBK、GB18030...
    哈尼橘橘阅读 588评论 0 1
  • 编码一直是让大家头疼的问题,特别是 GBK、GB2312、UTF-8 这三个比较常见的网页编码的区别,更是让许多新...
    Mr_Shadowalker阅读 466评论 0 0
  • 一直被字符的编码搞得头晕脑胀,经常出现乱码却又无可奈何,最近看到两篇讲字符编码的文章,这才有点头绪,于是决定把它写...
    lee_csu阅读 393评论 0 1
  • 历史的车轮 — 编码史 最早最早, 我们的计算机仅仅是用来做数字运算的, 所以没有编码这回事. 后来人们发现可以使...
    Justin13阅读 378评论 0 0
  • 什么是编码? 对于普通人来说,编码总是与一些秘密的东西相关联(加密与解密);对于程序员们来说,编码大多数是指一种用...
    SylvanasSun阅读 523评论 0 2