眼花缭乱的gbk iso-8859-1 unicode utf-8都是啥

写代码的过程中,经常会遇到好几个跟编码相关的关键词“gbk、unicode、utf-8、Latin-1、iso-8859-1”等等,经常是网上搜搜,解决了业务也就没细看,但是总查也是很烦人的,这几天好好看了下,记录下来。

参考很多大神的文章,会在文末放上链接。

开始。

  • ASCII (American Standard Code for Information Interchange 美国信息交换标准代码)

之初,美帝造计算机的时候,决定用八个晶体管为一组,即八位,代表二进制来存储信息,他们的基本信息也就是52个大小写英文字母,0-9十个数字和一些简单符号,这些字符再加上一些控制字符(控制硬件设备)拼拼凑凑一共凑到了128个(编号0到127),也就是用到了八个晶体管中的后七个,即从0000 0000到0111 1111(写成16进制:0x00~0x7F)这样,美国人就可以开心的使用计算机了。到此,这前128个符号,就称为“ASCII”。

  • Extended ASCII Codes(ASCII扩展字符)
  • ISO-8859-1
  • Latin-1

后来的最一开始,西欧人民看到计算机这个东西好啊,我们也要有,但是不支持自己语言,咋办,续上。就把空闲的第一个晶体管也给用上了,又续了128个字符出来。也就是在ASCII的基础上,编号0-127不变(兼容),编号128-255(1000 0000~1111 1111,16进制:0x80~0xFF)又给整上了。128-255这部分就是所谓的ASCII扩展字符集(Extended ASCII Codes),又称ISO-8859-1,又又称Latin-1,为啥都-1呢,因为开头讲了这部分是西欧人民续上的,所以续上的都是西欧常用字符,之后别的地方的人也搞,就陆续出了ISO-8859-2 Latin-2 ISO-8859-3 Latin-3等等等等,目前我看百度百科写的一共到了ISO-8859-16。

  • GB2312
  • GBK
  • GB18030

再后来,中国人民看到计算机这个东西吼啊,我们也要玩儿,但是咋办呢,一组八个晶体管一个能用的都没啦,全被西方给用完了,于是中国就决定把编号127之前的字符保留,128~255的符号摒弃,而且规定我们不止用一组晶体管,我们用两组,也就是用两个大于127编号的字符拼起来,当做一个中文汉字。这种满足ASCII的中文扩展就叫做GB2312。这有些小规定,查到的我就写上,规定前八位高字节范围:0xA1~0xF7 87个,后八位低字节范围:0xA1~0xFE 94个。这样大概能够存储7000多个常用汉字(为什么不是87*94=8000左右,因为这里也编入了数学符号,罗马希腊字母,日本假名以及原本ASCII里边就有的数字,字母等,也就是“全角”与“半角”的区别)。

但是但是,只存常用汉字不行啊,不常用的也得能表示啊,所以后来干脆取消了后八位低字节需要大于127的限制,只要是开头八位高字节大于127的两个字节在一起就表示一个汉字,这样又多了20000多个汉字(87*256)。这种,对GB2312的再次拓展,就叫做大名鼎鼎的GBK。

再往后些,GBK又加入了一些少数民族的字符,变身GB18030。
附上查询中文字符对应GBK编码的网址:GBK 编码范围, GBK 编码表

小结一下子:咱们中文字符占两个字节(两组8个晶体管),所以有咱们中文符号的编码集,称为 Double Byte Character Set:DBCS,双字节字符集。

  • Unicode

到这里,全球的语言编码是不是百花齐放,该鼓掌了吧?错,正是因为编码格式太多了,你不认识我的我不认识你的,各语言区域的人员没办法正常沟通,怎么构建和谐统一地球村?这时候,International Standard Organization(ISO国际标准化组织)出现了,他说你们都往后稍稍,我给你们整个一体化的编码方式吧,简单来说就是把地球村上所有的字符都给映射了一个唯一的数字编号,并放到了一张超大的大表格中,这样,全球的每一个符号都可以通过一个统一且固定的编码来编辑和保存了。这个方式(准确的说是字符--数字编号这个映射方式对应的集合)叫做UCS:Universal Multiple-Octet Coded Character Set,这我真不知道中文咋翻译了(通用多八字节字符集?)。。。更响亮的名字:Unicode。查了下,unicode目前一共映射了0x00~0x10FFFF即1114112个字符。全球字符这下子都能满足了。

举个栗子:字符 “a” 的unicode编码为0x0041(U+0041:U+后跟16进制数字表示unicode),汉字 “三” 的unicode为:0x4E09(U+4E09),具体汉字对应unicode可以从这里查看:http://www.chi2ko.com/tool/CJK.htm 

  • utf-8 (Unicode Transfer Format :unicode传输格式?)

上边说了,unicode已经能够包含地球所有符号了,但是,unicode只规定了每个字符的映射后的值,也就是0x0041、0x4E09这个,但并没有解决每个字符如何存储及传输的问题,具体来说,上边提的汉字 “三” ,unicode为0x4E09,换成二进制也就是计算机存储单位上就是:1001110 00001001,15位,得用两字节存储。换个大点的字呢,来个不常用的 “𠮷” ,这货的unicode为0x20BB7,也就是二进制的10 00001011 10110111,18位,得用三字节存储,那么问题来了,一会儿两字节一会儿三字节,计算机是不会知道遇到谁按几字节来识别的,所以需要一种更明确的方式来进行编码,或者说对Unicode进行完善。
这样就催生了utf-8的出现。utf-8是一种可变长度的unicode码的传输方式。具体来说,根据某个unicode码数所处的区间,给他转换一个新的映射方式。如下:

这样一来,不论计算机遇到了什么样的二进制,都能根据开头的0\1的组合,来反推出这个字符的unicode,进而识别出这个字符。
再举个栗子:汉字 “三” 的unicode为:0x4E09(U+4E09,1001110 00001001,处于00000800-0000FFFF区间内,所以他的utf-8编码为:11100100 10111000 10001001(从后往前替换x,缺位补0),也就是0xE4 0xB8 0x89,用java来验证一下,如图:

乍一看,-28 -72 -119好像跟上边11100100 10111000 10001001不对应啊,这是因为计算机的二进制是用补码进行运算的,所以将11100100 10111000 10001001分别转补码,得到10011100 11001000 11110111,分别是-28 -72和-119。

  • ANSI(American National Standards Institute:美国国家标准学会)

这个晕了好久,才明白,ANSI不是某一种编码方案,严格来讲他是一个制定了很多标准的组织,这个组织整合了全球除了美国人最先用的ASCII以外,自定义的适应本国语言环境且向下兼容ASCII的编码方案(也就是Latin-1、GBK等),并搞了一个叫“代码页:Code Page”的东西,具体请看:刨根究底字符编码之七——ANSI编码与代码页 - 知乎。微软公司开发系统卖到各国,觉得这个标准好,就把windows里编码统一写成了ANSI,所以我们用微软,ANSI默认就是GB系列编码,湾湾的系统ANSI默认是Big5编码,日本默认Shift JIS编码,等等等等。

以上就是跟编码相关的一些小总结了。

参考如下:
https://www.cnblogs.com/gavin-num1/p/5170247.html
https://zhuanlan.zhihu.com/p/27136737
https://zhuanlan.zhihu.com/p/137875615
https://www.cnblogs.com/crazylqy/p/10184291.html
https://www.cnblogs.com/reycg-blog/p/10021658.html
https://blog.csdn.net/guxiaonuan/article/details/78678043
http://blog.chacuo.net/371.html
https://www.cnblogs.com/haimishasha/p/6117968.html
https://blog.51cto.com/f1yinsky/2394164
https://www.cnblogs.com/malecrab/p/5300486.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值