Unicode和UTF-8的关系
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的关系的更多相关文章
- Unicode和UTF的关系
目录结构: contents structure [+] 什么是USC UCS的编码方式 Unicode的来源 为什么需要Unicode Unicode的方式 Unicode和UTF UTF和Unic ...
- 转:Unicode字符集和多字节字符集关系
原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ...
- 字符编码:Unicode和UTF-8之间的关系
Unicode和UTF-8之间的关系 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256 ...
- Unicode和UTF-8之间的关系
作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...
- Unicode、UTF-8 和 ISO8859-1
Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...
- Unicode 和 UTF-8 是什么关系?
2015-10-14 10:08 评论: 9 收藏: 4 转载自: http://huoding.com/2015/10/13/472作者: 火丁笔记本文地址:https://linux.cn/ ...
- unicode和utf8之间的关系
,字符编码是计算机技术的基石,想要熟练使用计算机,懂得一点字符编码的知识,还是很有必要的. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit ...
- Unicode 和 UTF-8 之间的关系
一.ASCII 码 我们知道,计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个 ...
- ascii、unicode、utf、gb等编码详解
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ...
- Unicode 与 UTF 字符标准
Unicode 国际字符标准(UCS)是一个字符编码系统,它被设计用来支持世界各国不同语言书面文体之间的数据交换.处理以及显示. Unicode用两个字节表示一个字符.前127个字符与A ...
随机推荐
- Centos——安装JDK
写在前面: Just mark! 创建linux虚拟机的时候经常要安装JDK,配置环境变量,却又经常忘记,这里记录一下. 环境:Centos-6.8-x86_64-minimal JDK :jdk-7 ...
- 旺财速啃H5框架之Bootstrap(二)
突然感觉不知道写啥子,脑子里面没水了,可能是因为今晚要出去浪,哈哈~~~提前提醒大家平安夜要回家哦,圣诞节生00000000000这么多蛋....继续 上一篇的已经把bootstrap了解个大概了,接 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入
系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...
- 比Mysqli操作数据库更简便的方式 。PDO
下面来说一下PDO 先画一张图来了解一下 mysqli是针对mysql这个数据库扩展的一个类 PDO是为了能访问更多数据库 如果出现程序需要访问其他数据库的话就可以用PDO来做 PDO数据访问抽象层1 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
- 基于Vue2.0的单页面开发方案
2016的最后一天,多多少少都应该总结一下这一年的得失,哪里做的好,哪里需要改进,记一笔,或许将来会用到呢. 毕业差不多半年了,一直是一个人在负责公司项目的前端开发与维护,当时公司希望前后端分离,提高 ...
- 自定义鼠标光标cursor
通过css属性 Cursor:url()自定义鼠标光标. {cursor:url('图标路径'),default;} url是自定义鼠标图标路径 default指的是定义默认的光标(通常是一个箭头), ...
- BPM配置故事之案例14-数据字典与数据联动
小明遇到了点麻烦,他昨天又收到了行政主管发来的邮件,要求把出差申请单改由H3 BPM进行,表单如下 行政主管的出差申请表 小明对表单进行了调整,设计出了一份适合在系统中使用的表单,但在"出差 ...
- Android的Kotlin秘方(II):RecyclerView 和 DiffUtil
作者:Antonio Leiva 时间:Sep 12, 2016 原文链接:http://antonioleiva.com/recyclerview-diffutil-kotlin/ 如你所知,在[支 ...
- Android开发学习—— Fragment
#Fragment* 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容* 生命周期方法跟Activity一致,可以理解把其为就是一个Activity* 定义布局文件作 ...