一文解读编码问题(关于ASCII,Unicode,UTF-8,GB2312,GBK,UTF-16)
一文解读编码问题
相信很多人经常看到什么ascii,什么Unicode,什么GBK以及GB2312等等
记忆中大一那会计算机老师会告诉你就是一个字母占一个字节,然后一个汉字占两个字节 这种话,其实压根不是这么回事!这句话其实非常不严谨,如果有的小伙伴用的是Mac或者Linux,你就发现真的不是这么回事!
字符编码的前世今生
拉丁文的字母约公元前7世纪~前6世纪时,由希腊字母间接发展而来,成为古罗马人的文字,古罗马灭亡前共包含23个字母,其中有18个辅音字母B、C、D、F、G、Z、H、K、L、M、N、P、Q、R、S、T、X、Y,4个元音字母A、E、I、O,和一个音值不定的V,11世纪时增加了J、U、W,形成了今天的26个字母。
首先计算机的历史其实并不久远,只是这个东西出道即巅峰,而且发展非常迅猛,各种技术层不穷!
最初,第一台计算机“ENIAC” 1946年诞生于在美国宾夕法尼亚大学
显然,这是老美的作品,在他们的文化中,26个字母就能描绘这个世界,
所以对于计算机而言,所要描绘的字符,最多就大小写字母加上为数不多的标点符号,就能完成!
这一切都显得是那么的和谐美好吧!
ASCII
所以老美的解决方案就是,ASCII!
小时候妈妈都可能告诉你计算机是二进制表示的,的确,一个字节八位,1<<8即256,所以,对于这些字母而言,存储只需要一个字节的大小就能解决问题!不能再多了!
但是,计算机的发展可谓迅猛!
在很多西方国家,确实这几个字母够表达了,但是对于像我们中华民族几千年文化,这种象形文字,就不说那些什么生僻字,还有什么古文字甲骨文啊之类的,就常用的这些字,少说也有10000+吧,
开什么国际玩笑,这个数量远远超过ascii编码所能表示的范围
GB2312
接下来又是一个历史的时刻,GB2312诞生了,这是中文的一种编码方案,完整的描述是
在继承ascii表的基础上,增加了一些常用的中文编码,当然关于这个编码规则可以自行查阅,后来又有了GBK,可以简单理解为gb2312是gbk的一个子集,因为gbk就是多增加了一些文字
这样中文的表述问题基本得到了解决!
国际化问题
接下来的问题是,中文的显示没毛病,但是这不是国际化标准,当你有个朋友在国外留学,你给他发条消息,本来在你电脑上是能正确显示的,但是发过去他看到的是乱码或者其他的文字(因为其他国家也肯定有他们自己文字的一套编码方案),绝非你想要的表达的意思,这问题很大吧?
你想一下,都2020了,倘若发条消息都成问题,那咋搞?
Unicode诞生
为了解决这种国际化的语言不通的问题, Unicode诞生了!
什么是Unicode
Unicode(
统一码、万国码、单一码
)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限
而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言
、跨平台
进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
“Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准”
这是百度百科的描述,强调这是一个标准,统一码就是全球这么多国家的文字,都统一编码了,也就是说每个标点,每个文字,不管你是中文,韩文或者日文在Unicode这套标准中都有唯一的标识,
为此,就不会出现你发消息过去乱码的情况了
Unicode只是一个标准
Unicode范围0x0-0x10FFFF(1114111)
看着这个范围,似乎明白了什么,就有的字只需要两个字节的空间就可存储在计算机中,但是有的字需要三个字节,为此,计算机针对Unicode的存储方案就诞生了!
UTF-8
UTF-16
UTF-32
Unicode存储实现
不管是UTF-8,UTF-16还是UTF-32,都强调以UTF-后面的数字为单位,分别是8位即一个字节为单位,16位两个字节为单位,32位4个字节为单位,
UTF-8因为是以一个字节为单位的,因为是一种变成方案,优点就是节省存储空间
对于UTF-16就是以两个字节为单位,如果Unicode范围超过两个字节的字符,就用四个字节存储
对于UTF-32就更简单暴力,直接以四个字节存储,不管你是什么字符都以四个字节存储,这种很明显就是太浪费空间,本来存储一个字母的只需要一个字节,现在用四个,相当于浪费了三个字节空间!
最后总结
字符编码其实就是一种映射关系,如果计算机是你发明的,你完全可以将你的名字定义为0x01,0x02,然而不是,所以通俗地将,就是别人定义的一套映射规则,就像97代表字母’a’一样,每一个字符都有对应的一个序号,切记Unicode只是一种标准,可以简单理解为类与对象的关系,UTF-8也好16也好都只是Unicode的一种实现!
还没有评论,来说两句吧...