论GBKUnicodeUTF-8的区别

Posted return-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论GBKUnicodeUTF-8的区别相关的知识,希望对你有一定的参考价值。

记得自己刚学计算机的时候,经常听到GBK,Unicode,UTF-8等编码,当时懵懵的,总是把GBK和Unicode搞混,那么这些编码到底有什么区别呢? 这还得从计算机的来由说起。


  • 很久很久以前,当计算机刚刚发明的时候,由于计算机只能接受2进制的数据,美国人民为了交流方便,约定了一套编码,他们用8根可以开合晶体管来表示不同的状态,一 共可以组成 2^8 种不同的状态,他们将A、B、C、D ...这些字母以及一堆奇奇怪怪的符号 (刚好128个字符,半个字节的长度,为了防止以后需要为新的符号编码,于是干脆取一个字节,最高位置为0。后七位从0-127分别对每一个符号编码) 与晶体管组成的状态一一对应,形成了一套名为ASCII的编码,计算机每次读取一个字节,然后参照ASCII表把这些编码翻译成字符。美国人民看到这样,很高兴。

  • 后来,计算机流传到了欧洲,发现不行啊,他们的大部分文字无法在计算机中表示,于是欧洲人就自己又整了套编码,把127以后的空位都用掉了,一个字节的长度,128~255这一页的字符集被称为拓展字符集,欧洲人民看到这里,很高兴。

  • 但从此之后,人类便没了新的状态可表示其他字符了,可是还有许多文字没办法表示呢。这时,计算机流传到了中国,但是已经没有多余的状态表示汉字了,难道中华民族5000年的历史要栽在计算机手里?!不不不,这点破事怎么能难道我们勤劳勇敢的中国人呢?(此处应有滑稽, 如果有掌声就更好了 ),于是我们便直接把那127后面的所有字符统统取消了,用两个字节来表示汉字。这就是现在的GBK编码了。
  • GBK编码规定,计算机在读入一个字节时不能那么死板,先看看第一位是不是0,如果是,就当做ASCII来读入一个字节,否则就读入两个字节(计算机:我我我我做错了什么啊QWQ)。中国人民看到这,觉得很好。


从此,天下便大乱了,欧洲人民的电脑无法读出我们电脑的信息,我们的电脑也读不懂他们的信息。
总而言之,一言蔽之,天下大乱,群雄并起,百姓生灵涂炭(此处应有滑稽,掌声就算了)。


于是乎,就有个国际组织站了出来,打算着手解决这个问题,他们说:这样吧,我给泥萌重新弄套编码,把大家的字符都整进来。于是,Unicode就这么横空出世了!!!这套编码从0一直算到了约100万(三个字节),它把所有的字符都收了进来,每个字符都有唯一的编号,这就解决了编码冲突问题,于是天下大定。但是事情并没有这么结束了,Unicode只是把大家的字符都归纳了进来,并没有为解码和传输做成规定。

  • 于是UTF-8、UTF-16、UTF-32这些编码方案就这样蹦了出来(注意,UTF-8并不是一种新的编码,他只是Unicode的实现方式之一)。为了节省空间,UTF-8采用变长编码,他可以使用1~4个字节来表示一个符号。

  • UTF-8的编码规则很简单,就两条:
    1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
    2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
  • UTF-8和Unicode转换
    在Windows系统下,有种最直接也最便捷的转换方法:记事本!是的你没听错,就是记事本大法!
    那么具体该怎么做呢?这里以UTF-8转Unicode文件为例来讲解:
    • 首先使用记事本打开一个UTF-8的文件,然后点击“另存为”,然后填好文件名称,在 编码(E) 里面选择 Unicode 并保存就可以啦。



参考博文:
https://www.cnblogs.com/dhsz/p/7737480.html
https://www.cnblogs.com/zhaoshujie/p/9594649.html

以上是关于论GBKUnicodeUTF-8的区别的主要内容,如果未能解决你的问题,请参考以下文章

论如何设计一款端对端加密通讯软件

这两个代码片段有啥区别?

这两个代码片段之间有区别吗?如果有,那又如何? [复制]

论NSString和NSMutableString 属性声明中copy/retain区别

课外阅读亮剑小说片段 毕业论文

jquery 对象的 heightinnerHeightouterHeight 的区别以及DOM 元素的 clientHeightoffsetHeightscrollHeightoffset(代码片段