Unicode和UTF-8都是表示编码,这个我一直都知道,但是这两个实际上是干什么用的,到底是怎么编码的,为什么有了Unicode还要UTF-8,它们之间有什么联系又有什么区别呢?这个问题一直困扰着我。相信不少人也会有这样的疑问。如果没有彻底弄清楚它们的关系,可能在开发的时候经常会被编码问题困扰。所以接下来就讲讲我通过查阅资料以及编码实践后得到的结论。

由于计算机一开始只在美国使用,他们的字符集只有大小写英文字母,阿拉伯数字,一些标点符号以及一些控制字符,总数只有一百多个。一个字节有八位,一共可以表示256种状态,所以,用一个字节表示这些字符足矣。于是就有了ANSI(American Standard Code for Information Interchange,美国信息互换标准代码)。

但是,当我们中国人也开始用计算机的时候,问题就暴露出来了-这么多的中文字符该怎么表示?

一个字节明显表示不了,两个字节是可以的,于是我们开始制定我们自己的编码规则以在计算机中正确的表示中文字符。于是就有了gb2312,它用两个字节来编码字符,为了使英文字符也能正确显示,我们规定低八位和ANSI是相同的,然后第一个字节的首位为1表示这是个中文字符。

不过不久之后又发现,还是有很多汉字在gb2312没有编码,一些复杂的汉字仍然表示不出来,于是就对它进行扩展,就有了gbk编码,gbk包含了gb2312的所有字符,同时增加了近20000个新字。后来少数名族也开始用电脑了,再次进行扩展,于是出现了gb18030。

  再接着,因为各个国家都要表示各自的文字,都像中国这样用自己的编码的话。各国之间的编码不能互相兼容,这样就带来了很多问题。为了解决这个问题,一个叫国际标准化组织(ISO)就站出来制定了一套地球上通用的字符集,名字叫做"Universal Multiple-Octet Coded Character Set",简称UCS,俗称Unicode。Unicode就是这样来的。

  Unicode规定必须用两个字节来表示一个字符,也就是16位来统一表示。对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原 来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此Unicode在保存英文字符时,会浪费一半的空间。因为这个问题,导致Unicode一直无法得到推广。

  直到后来互联网的出现,为了解决Unicode字符在互联网上传输的问题,于是UTF(UCS Transfer Format)出现了。可以说UTF不是一种新的类似GBK那种编码到字符的映射规则,而是用来规定Unicode传输存储的规则。同时出现了UTF 8,UTF 16, UTF 32。下面我们就重点讲讲最广泛的UTF 8到底是干嘛的。

  首先说UTF 8的结构。UTF 8是变长的,它表示英文字符集时只用一个字节,表示其它字符比如中文时用3-4个字节。举个例子,中文字符 "日",它在Unicode编码表里面的值为0x65E5,写成二进制就是

Unicode:01100101 11100101

UTF 8规定当字符占的位数为n,n > 1时,最高位的字节的最高n位为1,第n+1位为0,然后后面的字节的前两位都是10.然后剩余的位用Unicode值来填充,高位补0。格式就是下面这样:

一个字节: 0xxxxxxx

两个字节: 110xxxxx 10xxxxxx

三个字节: 1110xxxx 10xxxxxx 10xxxxxx

四个字节: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

因为日字需要用三个字节来表示,所以把日的Unicode(0x65E5)填充进去就是:

11100110 10010111 10100101

然后小写a,ANSI编码是97,Unicode编码也是97,所以a用utf8表示时二进制就是这样:

01100001

  UTF-8的工作原理,Unicode和UTF8的关系是不是瞬间就清楚了呢。

  然而,为什么UTF8这么强大的同时,我们自己的GBK编码为什么还是一直在使用呢?很显然,GBK表示一个中文字符只要2个字节,而UTF8需要3到4个字节,浪费了这么多空间,所以当已经明确没有其它国家的字符时,我们用GBK就好了。但随着现在网络资源和存储资源越来越宽裕,浪费这点空间已经慢慢变的无所谓了,所以UTF8会越来越流行。

Unicode和UTF-8的关系的更多相关文章

  1. Unicode和UTF的关系

    目录结构: contents structure [+] 什么是USC UCS的编码方式 Unicode的来源 为什么需要Unicode Unicode的方式 Unicode和UTF UTF和Unic ...

  2. 转:Unicode字符集和多字节字符集关系

    原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ...

  3. 字符编码:Unicode和UTF-8之间的关系

    Unicode和UTF-8之间的关系 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256 ...

  4. Unicode和UTF-8之间的关系

    作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...

  5. Unicode、UTF-8 和 ISO8859-1

    Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...

  6. Unicode 和 UTF-8 是什么关系?

    2015-10-14 10:08    评论: 9 收藏: 4 转载自: http://huoding.com/2015/10/13/472作者: 火丁笔记本文地址:https://linux.cn/ ...

  7. unicode和utf8之间的关系

    ,字符编码是计算机技术的基石,想要熟练使用计算机,懂得一点字符编码的知识,还是很有必要的. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit ...

  8. Unicode 和 UTF-8 之间的关系

    一.ASCII 码 我们知道,计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个 ...

  9. ascii、unicode、utf、gb等编码详解

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

  10. Unicode 与 UTF 字符标准

    Unicode 国际字符标准(UCS)是一个字符编码系统,它被设计用来支持世界各国不同语言书面文体之间的数据交换.处理以及显示.        Unicode用两个字节表示一个字符.前127个字符与A ...

随机推荐

  1. CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15

    之前有位搞平面的好友“小瘦”说CDR X8无法破解,只能用X7.呃……呃……呃……好像是的 其实CDR8难激活主要在于一个点“没有离线激活了,只可以在线激活”,逆天不是专供逆向的,当然没能力去破解,这 ...

  2. Spring之旅

    Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建 ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件

    系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...

  4. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. 基于fis3的组件可视化道路

    首先说明一下,即使不熟悉fis3,阅读文本应该也会有所收获. 本文以fis-parser-imweb-tplv2插件为模板插件,目的不在于使用哪个模板,而是组件可视化的实现思路,不必担心. 先说说模板 ...

  6. Android(安卓)-------CardView

    1.activity_main.xml <android.support.v7.widget.CardView android:id="@+id/cardView" andr ...

  7. Mach-O 的动态链接(Lazy Bind 机制)

    ➠更多技术干货请戳:听云博客 动态链接 要解决空间浪费和更新困难这两个问题最简单的方法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态的链接在一起.简单地讲,就是不对那些组成程序的目标文 ...

  8. angular中使用ngResource模块构建RESTful架构

    ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...

  9. Hbase安装和错误

    集群规划情况: djt1 active Hmaster djt2 standby Hmaster djt3 HRegionServer 搭建步骤: 第一步:配置conf/regionservers d ...

  10. Visual Studio 实用扩展推荐

    Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源).在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率. C# ...