美文网首页编程爱好者
[字符集与编码 1] 字符集与编码

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

作者: 裤lue | 来源:发表于2015-11-23 21:05 被阅读53次

一些基本概念

编码

我们都知道,计算机只能识别二进制数字,当你输入字母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

相关文章

  • 刨根究底字符编码之九——字符编码方案的演变与字节序

    字符编码方案的演变与字节序 一、字符编码方案的演变 1. 前文已经提及,编号字符集CCS(简称字符集)与字符编码方...

  • 字符集与编码

    字符集与编码 ANSI编码 ANSI(American National Standard Institute),...

  • 关于JavaScript编码你应该知道的

    1. 字符集和编码的关系 字符集是字符的集合,编码则是字符集中的字符要如何存储的规则。 如上图,当字符集和编码一一...

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

    一些基本概念 编码 我们都知道,计算机只能识别二进制数字,当你输入字母A时,A会被转换为01000001,这样才能...

  • 字符集与字符编码

    1.字符集字符集是字符的集合,是一系列字符与二进制序列的映射关系,例如ASCII字符集。2.字符编码字符编码是字符...

  • Java内存中的文本编码

    1、编码简介 1.1 概念简析:字符、字符集、编码字符集、Code Point、Code Unit和字符编码格式 ...

  • [java]14、转换流

    1、字符编码和字符集 字符编码:就是一套自然语言的字符与二进制数之间的对应规则。字符集:也叫编码表。是一个系统支持...

  • mysql字符集编码和数据类型

    字符集编码 字符集是一套符号和编码。mysql、database、table、column都可以设置编码。 更改字...

  • JavaWeb开发之编码格式

    编码格式 Java语言在内存当中默认使用的字符集 默认会用“Unicode”编码格式(字符集)来保存字符。 编码 ...

  • Node中的字符编码

    unicode 首先搞清两个概念,字符集 与 编码 字符集:字符集是一张码表,它规定了文字与数字的一一对应关系。与...

网友评论

本文标题:[字符集与编码 1] 字符集与编码

本文链接:https://www.haomeiwen.com/subject/blyrhttx.html