盒子
盒子
文章目录
  1. 1. 字符集(Charset)
    1. ASCII
    2. Unicode和UCS
    3. B2312和GBK
  2. 2. 回顾字符集
  3. 3. 参考资料

编码?你需要知道的那些事:1-了解字符集

这是之前写的文章,因为博客地址换了,重新发布下。

这个系列目前一共四篇文章,之后可能会增加Python3.x关于编码方面的内容。

编码?你需要知道的那些事:1-了解字符集

编码?你需要知道的那些事:2-明白编码

编码?你需要知道的那些事:3-Python2.x为什么有乱码

编码?你需要知道的那些事:4-Java为什么有乱码

更新:

关于Python3 的编码

相信大家都遇到过编码问题(正所谓所有问题都解决了,就剩下乱码了_)。每次出现这种问题时心里各种不爽,还让不让愉快地写代码了,人家不干了, 程序何必难为程序员啊!
你这时拍案而起,扬长而去,留下潇洒的背影…但是问题并么有解决,还是得埋头苦干啊 , 乱码是怎么来的呢?


图片来源

要明白这个问题, 我们得先了解两个概念(可以说是非常重要的吧)。

  1. 编码字符集(Charset),以下称为字符集
  2. 字符集编码(Encoding),以下称为编码

我们先来了解字符集是什么东东,下篇再进行讨论编码。

1. 字符集(Charset)

简单来说,字符集就是我们能看到的东西,它决定了我们能在计算机上看到什么。我们常见常用的字符集有哪些呢? **UTF-8 ? UTF-16? UTF-32? ISO-8859-*? ASCII? GB2312? GBK? Unicode? UCS?**好吧, 你知道的真不少,但是上面的不全是所谓的字符集。有些我们叫字符集,有些叫编码,有些居然即又叫字符集又叫编码。希望你没有被弄迷糊。不过,先看,最后给出总结。

ASCII

没错,就是大名鼎鼎的ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)。注意哦,它主要用于显示现代英语的(原因你懂的,毕竟人家是先行者)。ASCII等同于国际标准ISO/IEC 646。

ASCII规定的一个字符占8位(8位可以表示的字符为:2^8=256个),但是美国人民说,我们只需要空格及94个“可印刷字符”就够了(没办法,任性),这时,国际标准化组织(ISO)国际电工委员会(IEC)提出,可以使用剩下的区域来储存及表示其他使用拉丁字母的语言(主要是欧洲国家的语言)嘛,从此便有了ISO 8859-*系列(兼容ASCII,因为主要进行的是扩展),比如(ISO/IEC 8859-1 (Latin-1) - 西欧语言,ISO/IEC 8859-2 (Latin-2) - 中欧语言等等)。

Unicode和UCS

**Unicode:**来源于美国加州的Unicode组织(包括苹果,惠普,微软,施乐等公司)。Unicode是为了解决传统的字符集方案的局限而产生的,例如上面提到的ISO 8859-1字符集虽然在特定的国家广泛使用,可是在不同国家间却经常出现不兼容的情况(此时很多国家都有自己的字符集,比如我们,谁叫ASCII不支持中文的…)。

Unicode的目的之一就是让世界人民都用Ta家的字符集,Ta的方法也是非常的简单粗暴,不就是字符太多8位表示不了吗?加!所以Ta一开始采用了16位(2^16=65536), 可以表示65536个字符,可Ta万万没想到的是,全世界的字符数量超乎Ta想象,待Ta认识到时,Unicode的规范已经制定的八九不离十了,也得到了很大的普及(看看Ta的组成公司就知道了),重新来过是不可能了,所以Ta也给我们带来了一点点的麻烦(但是当初的目的是好的),等我们讨论到编码问题时还会说到这个问题的解决方法(当然是一个妥协的方法)。

UCS( Universal Coded Character Set): 在Unicode制定的同时,还有一个机构也在为世界人民的幸福苦苦思索,他就是我们上面提到的国际标准化组织(ISO)(好像哪里都有他的事…),他提出了UCS字符集,也就是ISO/IEC 10646 (名字好像上面提到的ISO/IEC 646他哥)。CUS定义了一个31位的字符集(一共是32位,不过只用31位来表示字符,其实已经很多了),这样可以表示的字符贼大了(2^31=2147483648个),足以包括世界上所有的字符(火星的呢,还不确定)。但是他也有一个问题,一个字符’A’,ASCII一共占用8位,而他却要占用32位,也太浪费了不是,当初的计算机内存可是很珍贵的(现在也一样),同样在讨论编码问题时,也会说到一个解决办法(同样是折中的)。

UCS与Unicode合并? 由于Unicode与UCS(ISO/IEC 10646国际编码标准)从内容上来说是同步一致的。在1991年,Unicode与ISO国际标准化组织决定共同制订一套适用于多种语言文本的通用编码标准。Unicode与UCS于1992年1月正式合作发展一套通用编码标准。(两者付出了很多的努力,因为他们一开始就是不兼容的,但是幸运的是,他们的努力得到了回报,非常感人)。最终,两者统一了字符集(即任何一个在Unicode中存在的字符,在UCS中也存在),且最靠前的65535个字符也统一了字符的编码。对于码空间,两者同意以一百一十万为限(即两者都认为虽然65536不够,但2的31次方又太大,一百一十万是个双方都可接受的码空间大小,也够用,当然,这里说的一百一十万只是个约数),Unicode将码空间扩展到了一百一十万,而UCS将不使用一百一十万以后的码位。也就是说,现在再讲Unicode只包含65536个字符是不对的。除了对已经定义的字符进行统一外,Unicode联盟与ISO工作组也同意今后任何的扩展工作两者均保持同步,因此虽然从历史的意义上讲Unicode与UCS不是一回事(甚至细节上说也不是一回事),但现在提起Unicode,指代两者均无不妥。

B2312和GBK

终于说到咱们的字符集了(注意目前一直在讲的都是字符集),那就是熟悉而又陌生的GB2312和GBK,是不是很鸡冻呢?
**GB2312:**全称是:信息交换用汉字编码字符集,可见,最初它就是一种字符集,它兼容ASCII,同时加入了6763个汉字和一些其他字符。

**GBK:**全称是:汉字内码扩展规范,看着名字就知道了,他其实是GB2312的扩展,加入了更多的汉字。

不对,GB2312和GBK不是常说的编码吗?,好吧,等我们讨论到编码时再来回答这个问题。

2. 回顾字符集

上面讨论到了这么多的字符集ASCII, Unicode, USC,GBK等等,他们的意义就是决定了我们可以看到的字符总数(当然是在计算机中啦,手写谁不会呢…)。编码准备留到下一篇文章讨论。

3. 参考资料

Python字符串和编码
Mapping codepoints to Unicode encoding forms
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
Java中的字符集编码入门
What’s the difference between encoding and charset?
Unicode
通用字符集
UTF-8
unicode.org
unicode百科

支持一下
扫一扫,支持forsigner