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. 在.Net中实现自己的简易AOP

    RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...

  2. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  3. C# 生成验证码图片时消除锯齿

    引言 基于生成图片实现了一个手机号转图片的需求. 内容也很简单,直接用手机号生成一个png图片.就是为了背景透明以便其他地方调用. 有无锯齿主要依靠一句代码:g.TextRenderingHint= ...

  4. SharePonit 2010 更改另存为列表模板的语言类型

    从朋友处得来一个列表模板:AccessApplicationSharePoint.stp 将其通过:网站操作----网站设置----列表模板,上传进去.然后去创建列表,发现找不到此模板. 根据多年老司 ...

  5. Linux实战教学笔记01:计算机硬件组成与基本原理

    标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...

  6. Spring Quartz实现任务调度

    任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...

  7. fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)

    andrew,20130601,guilin 本文记录在树莓派(fedora)上部署ASP.NET MVC2 的过程. 本文共分为六部分,分别是前置条件,Apache的安装,Mysql的安装,安装mo ...

  8. 一年之计在于春,2015开篇:PDF.NET SOD Ver 5.1完全开源

    前言: 自从我2014年下半年到现在的某电商公司工作后,工作太忙,一直没有写过一篇博客,甚至连14年股票市场的牛市都错过了,现在马上要过年了,而今天又是立春节气,如果再不动手,那么明年这个无春的年,也 ...

  9. php杂记(二)

    1.获取客户端真实IP if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $onlineip = $_SERVER['HTTP_CLIENT_IP']; } else ...

  10. Nginx 配置简述

    不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...