字符编码小结

ASCII码:

计算机以二进制的0和1来存储和处理所有信息,其中每个0和1被称为一位(bit),用小写的b表示;8个bit可以组成一个字节byte,用大写B表示,1B=8bit。一个字节共有0000 0000 - 1111 1111 共256种组合,美国国家标准学会(ANSI, American National Standards Insitute)将这些组合与英文字符、空格以及其他一些控制符号一一对应,形成了ASCII(American Standard Code for Information Interchange)字符集编码表。ASCII共收录了128个字符,它们的编码就是对应的二进制数0000 0000 - 0111 1111,ASCII只占用了一个字节的后7位,最前面的一位都是0。

字符串 <--> 字符 <--> 二进制存储


GB2312和GBK:

计算机技术传入非英语国家后,ASCII就无法满足需求了。开始的时候,一些国家采用一个字节里空余的0、1组合与一些字母、符合对应,形成了包括1000 0000 - 1111 1111的“扩展字符集”编码表。但是,这还是远远不够的。于是,每种语言都开始重新制定自己的字符集和相应的编码表,由于单字节能表示的字符太少(256个),这些字符集不约而同的采用了多字节来表示字符,形成了一系列多字节字符集(Multi-Byte Character Set),如GBxxx、BIGxxx等字符集采用了两个字节编码,它们的规则是,如果第一个字节小于等于0111 1111,则仍然表示ACSII字符;而如果大于等于1000 0000,则跟下一个字节一起共16位表示一个字符。

GB2312字符集编码表源于1981中国发布的标准,采用了两个大于等于1000 0000的字节连在一起,即1xxxx xxxx 1xxxx xxxx,表示一个字符,收录了6763个汉字以及拉丁字母、希腊字母、平假名、片假名、俄语西里尔字母等682个字符,GB2312还把ASCII里原有的数字、标点、字母按照自己的规则重新编写成两个字节、形成了“全角”字符。

GB2312字符集编码规则只是包含了2的14次方共16384个码位,无法满足庞大的汉子库的需求,于是在兼容GB2312的基础上,MicroSoftliyongGB2312方案中第二个字节里小于0111 1111的空间,收录了GB13000.1-93全部字符,制定了GBK字符集编码方案,即“汉字内码扩展规范”,GBK中的“K”就是“扩展”的汉语拼音中的“K”。GBK包含2的15次方共32767个码位,收录了21886个汉字和图形符号,包括GBK2312中的全部字符,以及繁体汉字、部首、符号。GBK被MicroSoft用在Window 95中,成为广泛应用的汉字字符编码方案。


Unicode:

随着计算机越来越普及,各个国家都想搞出一套自己的编码标准,这样会导致互相之间谁也不懂谁的编码,谁也不支持谁的编码,国际间的交流就会出现“乱码”。此时,国际标准化组织(ISO)和由Xerox、Apple等软件制造商组成的统一码联盟开始尝试独立创建单一字符集。1991年前后,两个项目的参与者都意识到世界本是大同,不需要两个不兼容的字符集。于是,他们开始合并双方的工作成果,并为创立一个单一的编码表而协同工作,Unicode也就在这之后诞生。此处有掌声

Unicode在“字符”和“二进制存储”之间引入了一个抽象层,这样的好处就是可以在不考虑具体的存储时,表示更多的字符。此时字符串的存储和展示有这样的关系:

字符串 <--> 字符 <--> 十六进制数描述 <--> 二进制存储

人们在这时终于意识到字符集的编码表和计算机的数字编码是可以不同的,“十六进制描述”即所谓的code point,它与具体的存储无关,只用来进行字符到数字(0/1)的映射。对于具体的存储,可以采用各种符合需求的编码方式,当然也可以采用"code point"转二进制数的方式。但直觉这样做会产生一些诸如:可移植性(CPU处理的字节序问题,大端小端存储)、空间浪费(英文字母产生很多0字节)等。聪明的人类对此制定了UTF(UCS Transfer Format)方案,将unicode的字符集编码按照UTF的规则进行重新编排。目前国际上用最多的时UTF-8编码。

概括的说来,Unicode是一个字符集,UTF-8是在这个字符集基础上的一种具体的编码实现方案。


参考资料:

http://www.zhihu.com/question/23374078#

http://flyer103.diandian.com/post/2014-03-09/40061199665

http://about.uuspider.com/2015/07/20/decode.html

https://zh.wikipedia.org/wiki/UTF-8

https://zh.wikipedia.org/wiki/通用字符集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值