Unicode(UTF-8, UTF-16)的简单理解
文章目录
- 一、Unicode出现的意义
- 1)背景
- 2)发展起源ASCII码
- 3)ASCII码的缺点和优点
- 4) Unicodey出现的意义
- 二、Unicode详细介绍
- 0)Unicode定义
- 1)涉及的步骤
- 2)UTF-8 和UTF-16的出现原因
- 3)UTF-8 与UTF-16的区别
- 三、UTF-32补充说明
一、Unicode出现的意义
1)背景
计算机只认识0101这样的字符串,很多时候为了描述简单都用十进制,十六进制,八进制表示.实际上都是等价的,没啥太多不一样,其他啥文字图片之类的其他东东计算机不认识.那为了在计算机上表示这些信息就必须转换成一些数字.你肯定不能想怎么转换就怎么转,必须得有定些规则.
2)发展起源ASCII码
于是刚开始的时候就有ASCII字符集(American Standard Code for Information Interchange
美国信息交换标准码),用7 bits来表示一个字符,总共表示128个字符,实际就是用字节(byte,即8个01串)来作为基本单位.那么怎么当用一个字节来表示字符时第一个bit总是0,剩下的七个字节就来表示实际内容。后来IBM公司在此基础上进行了扩展,用8bit来表示一个字符,总共可以表示256个字符.也就是当第一个bit是0时仍表示之前那些常用的字符.当为1时就表示其他补充的字符.
3)ASCII码的缺点和优点
- 优点
英文字母再加一些其他标点字符之类的也不会超过256个.一个字节表示主足够了 - 缺点
但其他一些文字不止这么多 ,像汉字就上万个.于是又出现了其他各种字符集.这样不同的字符集交换数据时就有问题了.可能你用某个数字表示字符A,但另外的字符集又是用另外一个数字表示A.这样交互起来就麻烦了.于是就出现了Unicode和ISO这样的组织来统一制定一个标准,任何一个字符只对应一个确定的数字.ISO取的名字叫UCS
(Universal Character Set),Unicode
取的名字就叫unicode了.
4) Unicodey出现的意义
总结起来为啥需要Unicodey就是为了适应全球化的发展,便于不同语言之间的兼容交互,而ASCII不再能胜任此任务了.
二、Unicode详细介绍
0)Unicode定义
- 定义
unicode的第一个版本是用两个字节(16bit)来表示所有字符,实际上这么说容易让人产生歧义,我们总觉得两个字节就代表保存在计算机中时是两个字节.于是任何字符如果用unicode表示的话保存下来都占两个字节.其实这种说法是错误的.
1)涉及的步骤
- 涉及的步骤
1)首先是定义一个规范,给所有的字符指定一个唯一对应的数字,这完全是数学问题,
可以跟计算机没半毛钱关系
2)第二步才是怎么把字符对应的数字保存在计算机中,这才涉及到实际在计算机
中占多少字节空间.
2)UTF-8 和UTF-16的出现原因
Unicode是用0至65535之间的数字来表示所有字符.其中0至127这128个数字表示的字符仍然跟ASCII完全一样.65536是2的16次方.这是第一步.第二步就是怎么把0至65535这些数字转化成01串保存到计算机中.这肯定就有不同的保存方式了.于是出现了UTF(unicode transformation format),有UTF-8,UTF-16.
3)UTF-8 与UTF-16的区别
UTF-8
UTF-8,这里的8非常容易误导人,8不是指一个字节,难道一个字节表示一个字符?实际上不是.当用UTF-8时表示一个字符是可变的,有可能是用一个字节表示一个字符,也可能是两个,三个.当然最多不能超过3个字节了.反正是根据字符对应的数字大小来确定.UTF-16
UTF-16比较好理解,就是任何字符对应的数字都用两个字节来保存
.我们通常对Unicode的误解就是把Unicode与UTF-16等同了.但是很显然如果都是英文字母这做有点浪费.明明用一个字节能表示一个字符为啥整两个啊.补充、
EF BB BF 表示UTF-8
FE FF 表示UTF-16.举例
1)假如用UTF-16表示的话就是01101100 01001001(共16 bit,两个字节).程序解析的时候知道是UTF-16就把两个字节当成一个单元来解析.这个很简单
2)用UTF-8就有复杂点.因为此时程序是把一个字节一个字节的来读取,然后再根据字节中开头的bit标志来识别是该把1个还是两个或三个字节做为一个单元来处理.
0xxxxxxx,如果是这样的01串,也就是以0开头后面是啥就不用管了XX代表任意bit.就表示把一个字节做为一个单元.就跟ASCII完全一样.
110xxxxx 10xxxxxx.如果是这样的格式,则把两个字节当一个单元
1110xxxx 10xxxxxx 10xxxxxx 如果是这种格式则是三个字节当一个单元.比较
1)这是约定的规则.你用UTF-8来表示时必须遵守这样的规则.我们知道UTF-16不需要用啥字符来做标志,所以两字节也就是2的16次能表示65536个字符.
2)而UTF-8由于里面有额外的标志信息,所有一个字节只能表示2的7次方128个字符,两个字节只能表示2的11次方2048个字符.而三个字节能表示2的16次方,65536个字符.
3)由于"汉"的编码27721大于2048了所有两个字节还不够,只能用三个字节来表示.
所有要用1110xxxx 10xxxxxx 10xxxxxx这种格式.把27721对应的二进制从左到右填充XXX符号(实际上不一定从左到右,也可以从右到左,这是涉及到另外一个问题.等会说.刚说到填充方式可以不一样,于是就出现了Big-Endian,Little-Endian的术语.Big-Endian就是从左到右,Little-Endian是从右到左.总结
由上面我们可以看出UTF-8需要判断每个字节中的开头标志信息,所以如果一当某个字节在传送过程中出错了,就会导致后面的字节也会解析出错.而UTF-16不会判断开头标志,即使错也只会错一个字符,所以容错能力强.
三、UTF-32补充说明
简介
前面说的都是unicode的第一个版本.但65536显然不算太多的数字,用它来表示常用的字符是没一点问题.足够了,但如果加上很多特殊的就也不够了.于是从1996年开始又来了第二个版本.用四个字节表示所有字符.这样就出现了UTF-8,UTF16,UTF-32.原理和之前肯定是完全一样的,UTF-32就是把所有的字符都用32bit也就是4个字节来表示.然后UTF-8,UTF-16就视情况而定了.UTF-8可以选择1至8个字节中的任一个来表示.而UTF-16只能是选两字节或四字节…由于unicode版本2的原理完全是一样的,就不多说了.分类
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.补充
其中的UCS就是前面说的ISO制定的标准,和Unicode是完全一样的,只不过名字不一样.ucs-2对应utf-16,ucs-4对应UTF-32.UTF-8是没有对应的UCS好文要顶 关注我 收藏该文
Unicode(UTF-8, UTF-16)的简单理解相关推荐
- 代码点与代码单元和Unicode相关的UTF
java字符串由char序列组成,char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元,大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元来表 ...
- Spring Security并没有那么难嗷 简单理解OAuth2.0
文章目录 1. 基本概念 1.1 什么是认证 1.2 什么是会话 1.3 什么是授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 基于角色的访问控制 1.5.2 基于资源的访问控制 2. 基 ...
- 学习:双机热备、集群、负载均衡、SQL故障转移群集简单理解(转)
双机热备.集群.负载均衡.SQL故障转移群集简单理解平常,大家常提到几个技术名词:双机热备.集群.负载均衡.SQL故障转移群集.这里,就我的理解,和大家简单探讨下,有不足或错误之处还请各位指出! 这些 ...
- linun——SElinux的简单理解
SElinux简单理解 一.什么是SElinux? SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Co ...
- QTextStream 的简单理解
文章目录 QTextStream 的简单理解 QTextStream类提供了使用QIODevice读写文本的基本功能. 还有一种通常的用法就是控制台命令的读写 除了QTextStream的构造函数,还 ...
- 教你简单理解分布式与传统单体架构的区别
教你简单理解分布式与传统单体架构的区别 原文:教你简单理解分布式与传统单体架构的区别 分布式是一种系统架构方式,而在分布式系统中一般基于中间件进行开发,消息中间件是分布式系统中比较核心的中间件之一.这 ...
- linux文件系统只有几k,关于Linux文件系统的的简单理解和认识
关于Linux文件系统的的简单理解和认识 关于文件系统的运作,这与操作系统带的档案数据有关.例如Linux操作系统的档案权限(rwx)与文件属性(拥有者,群组,时间参数等).文件系统通常会将这两部分的 ...
- Linux 文件区块连续吗,关于Linux文件系统的的简单理解和认识
关于Linux文件系统的的简单理解和认识 关于文件系统的运作,这与操作系统带的档案数据有关.例如Linux操作系统的档案权限(rwx)与文件属性(拥有者,群组,时间参数等).文件系统通常会将这两部分的 ...
- 浏览器解析jsx_简单理解JavaScript,TypeScript和JSX
原标题:简单理解JavaScript,TypeScript和JSX Java: 基本概念: Java一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为Java引 ...
- 关于u-boot中的.balignl 16,0xdeadbeef的理解
最近在分析u-boot的源代码,看到这一行: .balignl 16,0xdeadbeef 不理解了,不知道为什么要这样写,0xdeadbeef,明显是个单词组,写在这里有何意义呢?然后在查阅了众多资 ...
最新文章
- 浪潮、寒武纪联手,目标:新基建智算中心
- java 小数精确_Java中小数精确计算
- poladuo network 轻松解决Windows系统棘手问题
- 如何做好SOC的一点点体会
- linux shell 日志环境变量 HISTFILESIZE 和 HISTSIZE的区别
- html php打开,html格式如何打开
- [luogu 4292][bzoj 1758][WC2010] 重建计划(点分治 + dp + 单调队列优化 + 启发式合并)
- 关于linux的进程和线程
- Jsoup解析HTML字符串
- PHP笔记-双色球例子
- Android移植的Box2D
- 计算包含+、-、*、/、(、)等几种运算符的表达式的值。
- 每周一书-《程序开发心理学(银年纪念版)》
- 【NetApp】NetApp存储设备的CPU使用率分析
- A题:电流信号检测装置(本科)-- 2018年TI杯大学生电子设计竞赛
- Topaz Adjust AI Mac
- flex盒子弹性布局-----摘抄博客等资料
- 个人笔记上传 -- linux简单命令
- 学习突围3 - 关于精力
- Python快速上手攻略