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. C# 在腾讯的发展

    本文首发我的微信公众号"dotnet跨平台", 内容得到大家热烈的欢迎,全文重新发布在博客,欢迎转载,请注明出处. .NET 主要的开发语言是 C# , .NET 平台泛指遵循EC ...

  2. python自动化测试(2)-自动化基本技术原理

    python自动化测试(2) 自动化基本技术原理 1   概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据. 掌握上面的这样的本领 ...

  3. 说说Golang的使用心得

    13年上半年接触了Golang,对Golang十分喜爱.现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的.一直 ...

  4. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

  5. nginx+php的使用

    原文来自:windows下配置nginx+php环境 按照他的步骤走,亲测可用! 但是这里他后面说的根目录可能有些人有点懵. 其实在设置的时候就设置了: 网站根目录就是www这个目录,如果没创建请自行 ...

  6. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  7. ActiveRecord模式整理

    DAO Data Access Object,数据访问对象 DAO是一个软件设计的指导原则,在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象 ...

  8. C# Entity Framework并发处理

    原网站:C# Entity Framework并发处理 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NE ...

  9. 1.Hibernate简介

    1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发;           b.大大减少代码量;           c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...

  10. HA 高可用软件系统保养指南

    又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...