utf-8和Unicode到底有什么区别?是存储方式不同?编码方式不同?它们看起来似乎很相似,但是实际上他们并不是同一个层次的概念,utf-8是unicode的实现方式。

要想先讲清楚他们的区别,首先应该讲讲Unicode的来由。

  • 众所周知,在盘古开天辟地之前,sorry ,走错片场了(⊙o⊙)…在计算机发明的时候 ,由于计算机你只能表示二进制的数据,美帝人民为了交流通信方便,约定了一个编码系统,就是ASCII码,把abc..xyz...ABC...XYZ...!@#...等字符分别和0,1,2,3,4......对应,发现差不多刚好128个数,半个字节的长度,为了防止以后需要为新的符号编码,于是干脆取一个字节,最高位置为0。后七位从0-127分别对每一个符号编码。

    • 于是,计算机每次读取一个字节,然后参照ASCII表把这些编码翻译成字符。美国人民很高兴,拿着自己玩去了.......
  • 后来欧洲人也玩计算机,发现不行啊,还有很多符号(法语,德语)ASCII没办法表示啊,于是欧洲人自己也撸了一套编码,一个字节的长度,把最高位也用掉了。这套编码叫ISO。

    • 和ASCII表类似,计算机也是每次只读一个字节,然后按照ISO表,解码出字符。于是欧洲人民也很高兴。
  • 中国人不高兴了,特么我们汉字有几万个,常用的就有几千个,没有两个字节根本交不了货。于是勤劳勇敢的中国人民就破天荒的用了两个字节来表示中文。整出一套GBK。为了现实我中华民族兼容并蓄,我们兼容了ASCII编码。

    • gbk编码规定,计算机不能在每次都只读一个字节那么死板了,你要先看看第一位是不是为0,要是为0 的话,就当作ASCII码来读入一个字节,不然的话就读入两个字节。
    • 计算机 : WTF ?? !!

于是天下就很乱了,欧洲人看不懂我们发过去的信息,我们也看不懂他们的东西,美国人看不懂我的东西,不过我们能看懂他们的信息。。。哈哈。

总之,天下大乱,群雄并起,百姓生灵涂........

版本1.

这个时候,就有个国际组织站出来了,说,这么着吧,我来撸一套编码,把大家的编码都归纳进来。于是unicode编码就出现了。这套编码表的编号从0一直算到了100多万(三个字节)。每一个区间都对应着一种语言的编码。目前几乎收纳了全世界大部分的字符。所有的字符都有唯一的编号,这就解决了解码的冲突,于是天下大定!但是,unicode把大家都归纳进来,却没有为编码的二进制传输和二进制解码做出规定。只留下一句:大哥只能帮你到这里了。

我知道你一定在想,要个毛的规定啊,每次让计算机读取三个字节然后参照Unicode表解码就好了。想法是好的,但是如果类似于1号编码这样的小数据编号也要三个字节的话,那么也就是0x000001,这简直就是浪费啊,明明一个字节就可以表示了,你非得整三个,所以你到底是几个意思呢?

不管怎么样,大哥虽然走了,但是问题还得解决啊,于是,就出现了如下解决方案:uft-8,utf-16,utf-32这些编码方案。utf-16是用两个字节来编码所有的字符,utf-32则选择用4个字节来编码。下面只讲一下utf-8这种解决方案,因为它用的最多,用得最多是因为在当时它的方案最好,最节省资源。

  • utf-8

utf-8为了节省资源,采用变长编码,编码长度从1个字节到6个字节不等

utf-8.png
  • 我知道你想说,明明看起来utf-16更加节省资源,节省空间,正常人都看得出来。但实际上,当时,互联网上绝大部分存在的资源都是英文的,英文在utf-16中也是2个字节,而在utf-8中则是1个字节。在当时,显然是utf-8更加节省资源。现在我们在中文世界里来比较他们,则是utf-16更加节省资源。

OK,关于unicode和utf-8的区别已经解释完毕了。下面用一个图来巩固一下那些区别

Unicode与uft-8的结构关系.png
 
 
版本2.

正在这时,大天使加百列及时出现了——一个叫 ISO
(国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号
的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。

unicode开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO
就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原
来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在
保存英文文本时会多浪费一倍的空间。

这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的strlen函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的,从unicode开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符“!同时,也都是统一的”两个字节“,请注意”字符”和”字节”两个术语的不同,“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。在unicode中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。

unicode同样也不完美,这里就有两个的问题,一个是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是
分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每
个英文字母前都必然有二到三个字节是0,这对于存储空间来说是极大的浪费,文本文件的大小会因此大出二三倍,这是难以接受的。

unicode在很长一段时间内无法推广,直到互联网的出现,为解决unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII
码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中
文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。

Unicode符号范围 | UTF-8编码方式

(十六进制) | (二进制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 
 
 

ascII、iso、utf-8、Unicode的区别的更多相关文章

  1. 字符编码的故事(ASCII,ANSI,Unicode,Utf-8区别)转载

    http://www.imkevinyang.com/2009/02/字符编解码的故事(ascii,ansi,unicode,utf-8区别).html 很久很久以前,有一群人,他们决定用8个可以开合 ...

  2. 字符编码的故事:ASCII,GB2312,Unicode,UTF-8,UTF-16

    http://blog.csdn.net/longintchar/article/details/51079340 ****************************************** ...

  3. 彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, Utf-8

    彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, U 1.ASCII: 0-127(128-255未使用),美国标准 2.IS0-8859-1(lati ...

  4. 字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)

    (关于字符编码的深入解释,请参见我的原创文章<关于字符编码,你所需要知道的>.) 此文为转载,有少许修订,原文出处不详. 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...

  5. 字符编解码的故事–ASCII,ANSI,Unicode,Utf-8区别(转)

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为”字节”. 再后来,他们又做了一些可以处理这些字节的 ...

  6. 字符编解码的故事(ASCII,GBK,Unicode,Utf-8区别)

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一 ...

  7. ASCII与UNICODE的区别

    1.ASCII的特点 ASCII 是用来表示英文字符的一种编码规范.每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00H—FFH).这对于英文而言,是没有问题的 ...

  8. [编码]ASCII、GBK、Unicode(万国码) 和 UTF-8

    American ASCII编码 (American Standard Code for Information Interchange,美国信息互换标准代码)  China    gbk编码     ...

  9. 字符编解码的故事(ASCII,ANSI,Unicode,Utf-8)

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一 ...

随机推荐

  1. 狄利克雷卷积&莫比乌斯反演

    昨天刚说完不搞数论了,刚看到一个\(gcd\)的题目dalao用这个做了,虽然比正解麻烦,还是打算学一学了 数论函数: 数论函数的定义: 数论函数亦称算术函数,一类重要的函数,指定义在正整数集上的实值 ...

  2. 通过vSphere API获取对象Statistics

    预备知识点: 1.vim.PerformanceManager.MetricId()    通过counter_id获取到metric_id 2.vim.PerformanceManager.Quer ...

  3. Spring Cloud之整合ZK作为注册中心

    Eureka已经闭源了,用zk可以替代之 Eureka 作为注册中心 Dubbo也是zk作为注册中心的 Zookeeper简介 Zookeeper是一个分布式协调工具,可以实现服务注册与发现.注册中心 ...

  4. BZOJ 2243 [SDOI2011]染色:树剖【维护路径上颜色段】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 题意: 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径 ...

  5. 智课雅思词汇---十四、ante,anti不仅是词根还是前缀

    智课雅思词汇---十四.ante,anti不仅是词根还是前缀 一.总结 一句话总结:来源于拉丁语 ante 前.词根ant 为 anti 的变体.ante,anti不仅是词根还是前缀. 词根:ante ...

  6. 京东自营,你TM太坑了。

    双12来了,京东自营好坑.昨天(12月6日)看的一条秋裤,89元,今天准备买,居然涨到了119,他大爷的. 京东你大爷的.

  7. linux命令学习笔记(14):head 命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显 示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. .命令格式: hea ...

  8. noip不知道哪年 货车运输

    题意:最大生成树上找 q组两个点的lca 然后求出u->lca->v这条路径上的最小边 倍增大法好 # include <iostream> # include <std ...

  9. JS字符串类型转日期然后进行日期比较

    1.字符串转日期格式 var stringToDate = function(dateStr,separator){ if(!separator){ separator="-"; ...

  10. navicat导入sql文件

    Hello,大家好.Navicat是我们平时使用较多的一个数据库客户端工具,平时小天我主要是用来连接mysql的,使用的时候还是很方便的. 今天小天我就给大家分享一个Navicat如何导入导出sql文 ...