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. KMP算法求解

    // KMP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespac ...

  2. bootstrap-datetimepicker 进一步跟进~~~开始时间和结束时间的样式显示

    上次简单介绍了一下:05.LoT.UI 前后台通用框架分解系列之——漂亮的时间选择器(http://www.cnblogs.com/dunitian/p/5524019.html) 这次深入再介绍一下 ...

  3. nodejs进阶(2)—函数模块调用

    函数调用 1. 文件内普通函数调用 创建一个js文件命名为2_callFunction.js,其中定义一个函数fun1,向返回对象输出了一段字符串“你好,我是fun1”. //------------ ...

  4. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  5. Redis百亿级Key存储方案(转)

    1 需求背景 该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperi ...

  6. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

  7. 玩转spring boot——结合AngularJs和JDBC

    参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...

  8. Mybatis批量删除

    <delete id="deleteByStandardIds"> delete from t_standard_catalog where standard_id i ...

  9. H3 BPM初次安装常见错误详解1-4

    错误1: 首次安装完成无法访问,效果如下. 错误原因:没有配置IIS. 解决方法: 控制面板-程序-打开或关闭Windows功能,选择internet信息服务. 因为安装的时候没有没有iis,所以程序 ...

  10. Linux监控工具介绍系列——vmstat

      说来惭愧,玩Linux这么久了,居然没有玩转vmstat这个命令,对很多指标的具体意义都有点模糊不清,花了点时间好好学习.整理一下这个命令的相关资料.因为这个命令确实比较重要,而且频繁用到. 命令 ...