您的位置:首页 > 理论基础

计算机是如何解析我们的汉字和英文?什么是字符集?为什么会出现乱码?

2013-06-18 17:47 441 查看
文字乱码碰到很多次,每次都查资料,现在想把他们弄清楚,避免下次不再犯同样的错误!

本文主要内容主要为:

1, 计算机是如何解析我们的汉字和英文的?

2, 字符集是什么?字符集的由来?有哪些字符集?

3, 为什么有时候,打开软件或者文本会出现乱码?

对于计算机来说,整个世界就是0和1组成的,区别就在于0和1的数目多少问题.

比如对于小写字母a来说,我们怎么存入到计算机中呢?

计算机有一个最小单元(1Bit,存储0或者1),其中最小单位是1Byte(字节)=8个bit,其中通过排列组合一个字节会有2*2*2*2*2*2*2*2=256种可能,其中我们就用256种可能的一种,二进制01100001来表示a(97),什么意思,就是我们通过键盘输入小写字母a,计算机就会存储01100001来代表a,同理,对于汉字“中”来说,计算机就通过2个字节(65536种情况)里面的一种二进制10101010
10101011 来代表汉字中。

所以,当我们存储的时候和取出的时候,就会存在一种翻译的过程,把我们要输入的翻译成计算机所代表的0和1,把计算机所代表的0和1翻译成我们所想要表达的语言。

不同的国家,就有不同的文化,不同的文化就有不同的语言符合来表示文化里面的意思。

比如”太阳”,英文里面用符合“sun”来表示,阿拉伯语就用“شمس”这个来表示,中文就用“太阳”来表示。

所以,每一种不同的文化里面就有一种类似于hash表一样的符号集,符号集中每一种符号就对于计算机里面的一种二进制位。这个就是我们所说的字符集。

我们每一次读取或者输入都是通过这个字符集标准来一一匹配成我们所要表达的意思或者是计算机存储的二进制位。所以就有很多中编码表,因此同一个二进制位,在不同的文化里面就代表不同的意思,因此就存在翻译的乱码。

可能有人说,为什么不搞一个大的hash表,通过不同的二进制位来代表每一种文化里面每一种符号.这样就不会出现乱码的情况,是的,可惜当人们意识到这个问题的时候,全世界,已经有上百种编码表,甚至一个国家就好几种编码表。你说统一就统一,你说,法国把你国家的编码表给废掉,用我的,可能吗?
当然,除非如同秦始皇一样统一整个中国一样统一整个地球,用法令来强制废除地方(国家)编码表,全中国(全球)统一用一个编码表。这样就不会乱码啦?但你觉得现在可能吗?

对于现在全球来说,是提倡合作的,因此就有一个来自美国的国际组织“UNICODE”的组织,就打算干这样一件大事情,来统一所有的编码表,并且干的不错,经过三十多年的努力,现在国际上通信信息传输基本上都使用UniCode组织制定的大的hash表来表示意思。

现在大致说一下编码表所走过的路程?以及UniCode标准的意义,起码做到心中有数。

计算机是美国人发明的,因此美国制定第一张编码表ASCII,使用1个字节共256种二进制方式来表示英文字母,但对于美国来说只要127种二进制编码表就足矣,用阿拉伯数字表示就是0-127(你自己可以在二进制和十进制之间进行翻译,二进制不足用0表示一个完整的字节),

其中

0 – 31 控制符号

32 空格

33-47
常用符号

48-57
数字

58-64
符号

65-90
大写字母

91-96
符号

97-127
小写字母

美国老大,而且这个字符集是第一个弄出来的,因此后面的字符集以他为首(兼容他)

计算机到欧洲啦,欧洲里面的一些国家发现许多英文在本国没有,比如荷兰。

怎么搞?

他们借鉴美国ASCII设计思想,也是用一个字节来代表,为呢兼容,保留原有的0-127种二进制标准,从128到255种二进制来开始代表文化里面的意思,就出现呢ISO8859编码表,就出现呢国际标准化组织ISO8859。

计算机到中国啦,当时中国常用汉字就2千多个,你就是一个字节共256种二进制标准都给我用,也不够啊!因此,我们就2个字节来表示汉字。为呢跟国际编码表ISO8859兼容,第一个字节(高位)从176-247共72个,第二个字节(低位)从161-254共94个,所以72*94=6768种二进制来表示,这个就远远的够啦。这个编码表就是大名鼎鼎的GB2312编码表。

但是到后期不行啦,汉字被统计出来的越来越多,包含偏僻字啊等,6768种不够啦,怎么搞,扩展呗。

所以扩展第一个字节(高位)从81-254共174个,第二个字节(低位)40-254,去掉其中一部分,共125个,所以174*125=21750个,够啦,这个就是GBK编码表啦。向上支持ISO8859,向下兼容GB2312。

在次回到国际组织UniCode所推广的UniCode字符集,他也是2个字节来表示符号,因此他就又256*256=65536种二进制来表示不同的符号,因此他可以兼容ASCII,ISO8859,GBK

可惜,虽然65536种二进制可以涵盖绝大部分的国家标准,可他也不是万能的,一方面已经存在大量的以单字节编码的文档软件,另外一方面,别个是国家法律规定的比如中国GB2312和GBK,我有啦,我干嘛还去换你的编码表。

因此美国人又搞出呢一系列UTF标准,用来传输和保存UniCode编码表。这个UTF标准,说白啦,就是在UniCode标准的基础上,在进行一个标准来解析UniCode用来达到适合不同国家不同的编码表(等啥时候整个地球被统一啦,来个小说里面的联邦语言,就不存在这么头疼,这么多的的编码表啦)。常见的有UTF-7,UTF-8,UTF-16等,其中UTF-8在国际上用的最多,在中国也用的蛮多,微软的产品呗,用UTF-8标准。比如我用到的VS2008开发工具,操作系统上面的记事本,Xml标准等,都使用UTF-8标准。

还有一点,要说明下,这样更加容易理解乱码产生的原因。

关于计算机是如何解析单字符和双字符的,如果以1字符存储文字的话,后面会有一个“\0“表示结束,计算机读,从开头读到”\0”时就表示一个完整的意思,同理,用2个字节来存储文字的话,当计算机从开头读到第二个字节的”\0”的时候,就知道2个字节组成的一个符号代表一个完整的意思,之后在通过所对应的字符集,就解释出不同语言不同的符合出来。因此如果用2个字节存储的汉字,用单字节,比如ASCII来解析的话,计算机获得的数字在ASCII里面没有对应的符合来表示文字,因此就解析不出来,就出现乱码!

这个就是乱码出现的原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐