编程爱好者

[字符集与编码 1] 字符集与编码

2015-11-23  本文已影响53人  裤lue

一些基本概念

编码

我们都知道,计算机只能识别二进制数字,当你输入字母A时,A会被转换为01000001,这样才能被计算机阅读。这便是编码,即从字符到二进制数字的转换过程

解码

假设硬盘中有一份txt文档,里边含有你前几天编写的一段文字。由于计算机是以二进制数字的形式保存数据的,所以当你打开这份文件,并阅读其中的内容时,计算机便会把二进制数字转换为字符,这便是解码,即从二进制数字到字符的转换过程

字符集

字符集即字符的集合,由于种种原因,历史上出现了很多字符集,常见的字符集包括:

ASCII

ASCII字符集是由美国人发明的,它包含了255个字符,其中常用字符有127个,包括控制符(空格,换行...),英文26个字母的大小写,0到9的阿拉伯数字,以及一些常用符号(逗号,@符号...)。如果你仅需要表示英文和阿拉伯数字,ASCII是非常好的选择。

ISO8859-1

由于ASCII是由老美发明的,他们当初根本没有考虑到还要支持其他国家的语言,因此欧洲人就不爽了,因此欧洲人便发明了ISO8859-1。ISO8859-1不仅包含且兼容了ASCII中的所有字符,还加入了一些西欧字符。这样利用ISO8859-1字符集,便能表示西欧的语言了。(具体支持哪些西欧语言,请自行百度)

GB2312和GBK

由于ASCII与ISO8859-1均只支持欧美国家的字符,因此中国人民不爽了,所以发明了GB2312字符集,该字符集不仅包含且兼容了ASCII的所有字符,加入了大量常用的中文汉字。这样便可以使用GB2312来表示常见的中文字了。

由于GB2312只支持常用中文字,当表示生僻中文字时,GB2312也无能为力。因此便出现了GBK字符集。GBK不仅包含且兼容了GB2312的所有字符,还支持中文里的生僻字。因此如果你需要表示一些中文生僻字,GBK是更好的选择。

Unicode

从上面的情况来看,上述字符集都仅支持特定的自然语言。比如ASCII只支持英文,当遇到西欧语言时便无能为力。GBK只支持中文,当遇到拉丁文时,也是束手无策。因此这个世界迫切需要一种可以表达所有常用自然语言的字符集,因此Unicode字符集应运而生。Unicode支持所有常见自然语言的字符集,因此如果需要支持多国语言,Unicode字符集是最佳选择。

字符集编码

我们经常听到的ASCII, ISO8859-1, GB2312, GBK, UTF-8...这些都是常见的字符集编码(或称为编码规则)。在开头的例子中,便是利用了ASCII编码规则,确定了字母A对应的二进制数字是01000001。

字符集与字符集编码(编码规则)的关系

类比接口与实现类

读到这可能有童鞋已经晕了,或许会问:“为毛你一会儿说ASCII是字符集,一会儿又说ASCII是编码规则,它们到底是什么关系呢?”

要解答这问题并不难,只要类比Java中的接口与实现类的关系就清楚了。在Java中,接口定义了"要做什么事",在实现类中则定义了"该怎么做这件事"。同样的,你可以把字符集当做是Java中的接口,而把编码规则当做是Java中的实现类。因此就变为:ASCII编码规则实现了ASCII字符集。 也就是说,ASCII字符集规定了字符集包含了哪些字符,ASC编码规则说明了计算机应该如何使用二进制数字存储所支持的字符。对于ISO8859-1,GB2312,GBK也是同样的道理。

到这里,大家应该明白,字符集和编码规则在本质上来说是不一样的,或者是因为字符集和编码规则的名称正好相同,才造成了一定的误解吧(或许正是因为这些字符集正好只有一种编码规则实现了它,所以就偷懒,让他们具有同样的名称吧...猜的)。

Unicode的特殊性

上面并没有提到Unicode字符集。原因是:实现了Unicode字符集的编码规则是UTF-8,UTF-16,UTF-32。也就是说,有3种编码规则实现了Unicode字符集(注意,并没有一种叫做Unicode的编码规则!)。也就是说,对于Unicode系列来说,其字符集与编码规则不再是一 一对应的关系,而是一对多的关系!同时,字符集与编码规则也不再是同名的!

为什么会有多种编码规则实现了Unicode字符集呢?主要是因为人们对存储空间的苛刻要求。具体原因详见references中那位大神的博客。

总结

如果你还是没能理解字符集与编码规则的区别与联系(多半是因为我的文笔太差了!_ _), 可以去看下references中的两篇文章,看完以后肯定会有更深的理解。

在下一篇JavaHipster 2中,将重点学习常用的编码规则。

References

http://my.oschina.net/goldenshaw/blog/304493
http://my.oschina.net/goldenshaw/blog/305805

上一篇下一篇

猜你喜欢

热点阅读