文章目录

  • 一、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)的简单理解相关推荐

  1. 代码点与代码单元和Unicode相关的UTF

    java字符串由char序列组成,char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元,大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元来表 ...

  2. Spring Security并没有那么难嗷 简单理解OAuth2.0

    文章目录 1. 基本概念 1.1 什么是认证 1.2 什么是会话 1.3 什么是授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 基于角色的访问控制 1.5.2 基于资源的访问控制 2. 基 ...

  3. 学习:双机热备、集群、负载均衡、SQL故障转移群集简单理解(转)

    双机热备.集群.负载均衡.SQL故障转移群集简单理解平常,大家常提到几个技术名词:双机热备.集群.负载均衡.SQL故障转移群集.这里,就我的理解,和大家简单探讨下,有不足或错误之处还请各位指出! 这些 ...

  4. linun——SElinux的简单理解

    SElinux简单理解 一.什么是SElinux? SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Co ...

  5. QTextStream 的简单理解

    文章目录 QTextStream 的简单理解 QTextStream类提供了使用QIODevice读写文本的基本功能. 还有一种通常的用法就是控制台命令的读写 除了QTextStream的构造函数,还 ...

  6. 教你简单理解分布式与传统单体架构的区别

    教你简单理解分布式与传统单体架构的区别 原文:教你简单理解分布式与传统单体架构的区别 分布式是一种系统架构方式,而在分布式系统中一般基于中间件进行开发,消息中间件是分布式系统中比较核心的中间件之一.这 ...

  7. linux文件系统只有几k,关于Linux文件系统的的简单理解和认识

    关于Linux文件系统的的简单理解和认识 关于文件系统的运作,这与操作系统带的档案数据有关.例如Linux操作系统的档案权限(rwx)与文件属性(拥有者,群组,时间参数等).文件系统通常会将这两部分的 ...

  8. Linux 文件区块连续吗,关于Linux文件系统的的简单理解和认识

    关于Linux文件系统的的简单理解和认识 关于文件系统的运作,这与操作系统带的档案数据有关.例如Linux操作系统的档案权限(rwx)与文件属性(拥有者,群组,时间参数等).文件系统通常会将这两部分的 ...

  9. 浏览器解析jsx_简单理解JavaScript,TypeScript和JSX

    原标题:简单理解JavaScript,TypeScript和JSX Java: 基本概念: Java一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为Java引 ...

  10. 关于u-boot中的.balignl 16,0xdeadbeef的理解

    最近在分析u-boot的源代码,看到这一行: .balignl 16,0xdeadbeef 不理解了,不知道为什么要这样写,0xdeadbeef,明显是个单词组,写在这里有何意义呢?然后在查阅了众多资 ...

最新文章

  1. 浪潮、寒武纪联手,目标:新基建智算中心
  2. java 小数精确_Java中小数精确计算
  3. poladuo network 轻松解决Windows系统棘手问题
  4. 如何做好SOC的一点点体会
  5. linux shell 日志环境变量 HISTFILESIZE 和 HISTSIZE的区别
  6. html php打开,html格式如何打开
  7. [luogu 4292][bzoj 1758][WC2010] 重建计划(点分治 + dp + 单调队列优化 + 启发式合并)
  8. 关于linux的进程和线程
  9. Jsoup解析HTML字符串
  10. PHP笔记-双色球例子
  11. Android移植的Box2D
  12. 计算包含+、-、*、/、(、)等几种运算符的表达式的值。
  13. 每周一书-《程序开发心理学(银年纪念版)》
  14. 【NetApp】NetApp存储设备的CPU使用率分析
  15. A题:电流信号检测装置(本科)-- 2018年TI杯大学生电子设计竞赛
  16. Topaz Adjust AI Mac
  17. flex盒子弹性布局-----摘抄博客等资料
  18. 个人笔记上传 -- linux简单命令
  19. 学习突围3 - 关于精力
  20. Python快速上手攻略

热门文章

  1. 基于 Python 的招聘信息可视化分析系统
  2. 八爪鱼采集列表和详情信息
  3. Revit2014: 板Slab在创建时候提示错误:“边界边缘线彼此相交。边界等高线不可扭曲。”
  4. python学习线路图(2018年更新版)
  5. 华南理工大学电子商务系管科面试记录
  6. 腾讯云轻量服务器和云服务器区别
  7. https中SSL加密过程详解,看这一篇就够了!
  8. 多商户商城系统哪家好?
  9. 微信生态SaaS服务商“微赞”完成数千万A轮融资,钜鑫资本投资
  10. 【k哥爬虫普法】简历大数据公司被查封,个人隐私是红线!