一文解读编码问题(关于ASCII,Unicode,UTF-8,GB2312,GBK,UTF-16)

深碍√TFBOYSˉ_ 2023-07-13 03:07 158阅读 0赞

一文解读编码问题

相信很多人经常看到什么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的一种实现!

发表评论

表情:
评论列表 (有 0 条评论,158人围观)

还没有评论,来说两句吧...

相关阅读

    相关 GB2312编码理解

        计算机信息交换使用汉字编码字符集是国家1980年发布,标准号为:GB2312-1980。     GB2312编码主要适用于汉字处理、汉字通讯等系统之间的信息交换。