目录结构:

contents structure [+]

1,什么是USC

USC是Universal Character Set的简称,也就是“通用字符集”,由ISO(International Organization for Standardization,国际标准化组织)制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。

1.1,USC的编码方式

USC有两种编码方式,分别为USC-2和USC-4。其中USC-2代表使用两个字节表示一个字符,USC-4代表使用4个字节表示一个字符。

2,Unicode的来源

2.1,为什么需要Unicode

计算机最开始在美国使用。一个字节有8位,也就是2的8次方,共表示256种状态。但是美国人的所有字符加起来,他们也就只用了128个,即使2的7次方,就是我们所熟知的ASCII编码。但是随着计算机的发展,慢慢地计算机被推广到全球,那么ASCII码中128个字符肯定不能够表示世界所有文化中的文字。由于世界文化的差异,因此全球许多国家编制了一套自己的字符对照表,比如:中国编制的GB2312(采用两个字节表示一个字符)。这种情况下,编码就出现了混乱,每个国家都有一套自己的编码,每个国家都不认识彼此的编码,这样极不利于计算机的推广和规范化。因此,ISO在这个时候站出来了,并且制定了一套USC(Universal Character Set)字符对照表,这套对照表就是Unicode前身。

2.2,Unicode的方式

我们现在知道了Unicode就是一个基于USC的字符对照表,接下来我们算一算USC最多能够表示的字符数量。如果采用USC-4,那么4个字节表示一个字符,也就是可以表示0xFFFFFFFF种字符,但是Unicode只表示到其中的0x10FFFF,所以Unicode表示范围是从0到0x10FFFF。UCS-4根据最高位为0的最高字节分成27=128个group。每个group再根据次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0的平面0被称作BMP(Basic Multilingual Plane 基本多文种平面)。如果UCS-4的前两个字节为全零,那么将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。每个平面有216=65536个码位。Unicode计划使用了17个平面,一共有17×65536=1114112个码位。在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。其中平面0上也定义了6400个码位的专用区域,就是0xE000-0xF8FF,还定义了2048个码位的代理区域,就是0xD800-0xDFFF。所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。0平面上的代理区域就是使用两个UTF-16字符表示BMP以外的字符。在Unicode5.0.0中,如果平面0,平面1,平面2,平面14,平面15,平面16中都把码位定义满了(平面15和平面16都只定义了65534个码位),则总码位=65536*6-4=393212个,但是在Unicode5.0.0中却只有238605个码位,所以6个平面中肯定还有一些平面没有完全定义。

  最高字节(group) 次高字节(plane) 第三字节(row)  第四字节(cell) 平面范围 备注
group 0, plane 0(BMP)

0000 0000 -

0000 0000

0000 0000-

0000 0000

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0 -

0xFFFF

Unicode已定义60528个码位

其中:0xE000-0xF8FF表示专用区域。

0xD800-0xDFFF表示代理区域。

有27973个码位表示汉字。

group 0, plane 1

0000 0000 -

0000 0000

0000 0001 -

0000 0001

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x10000 -

0x1FFFF

Unicode已定义3419个码位

group 0, plane 2

0000 0000 -

0000 0000

0000 0010 -

0000 0010

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x20000 -

0x2FFFF

Unicode已定义43253个码位

其中:43253个码位都表示汉字

group 0, plane 3

0000 0000 -

0000 0000

0000 0011 -

0000 0011

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x30000 -

0x3FFFF

Unicode未定义码位
group 0, plane 4

0000 0000 -

0000 0000

0000 0100 -

0000 0100

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x40000 -

0x4FFFF

Unicode未定义码位
group 0, plane 5

0000 0000 -

0000 0000

0000 0101 -

0000 0101

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x50000 -

0x5FFFF

Unicode未定义码位
group 0, plane 6

0000 0000 -

0000 0000

0000 0110 -

0000 0110

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x60000 -

0x6FFFF

Unicode未定义码位
group 0, plane 7

0000 0000 -

0000 0000

0000 0111 -

0000 0111

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x70000 -

0x7FFFF

Unicode未定义码位
group 0, plane 8

0000 0000 -

0000 0000

0000 1000 -

0000 1000

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x80000 -

0x8FFFF

Unicode未定义码位
group 0, plane 9

0000 0000 -

0000 0000

0000 1001 -

0000 1001

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x90000 -

0x9FFFF

Unicode未定义码位
group 0, plane 10

0000 0000 -

0000 0000

0000 1010 -

0000 1010

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0xA0000 -

0xAFFFF

Unicode未定义码位
group 0, plane 11

0000 0000 -

0000 0000

0000 1011 -

0000 1011

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0xB0000 -

0xBFFFF

Unicode未定义码位
group 0, plane 12

0000 0000 -

0000 0000

0000 1100 -

0000 1100

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0xC0000 -

0xCFFFF

Unicode未定义码位
group 0, plane 13

0000 0000 -

0000 0000

0000 1101 -

0000 1101

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0xD0000 -

0xDFFFF

Unicode未定义码位
group 0, plane 14

0000 0000 -

0000 0000

0000 1110 -

0000 1110

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0xE0000 -

0xEFFFF

Unicode已定义337个码位
group 0, plane 15

0000 0000 -

0000 0000

0000 1111 -

0000 1111

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0xF0000 -

0xFFFFF

Unicode只定义65534个码位

其中:0xF0000 - 0xFFFFD作为专用区

group 0, plane 16

0000 0000 -

0000 0000

0001 0000 -

0001 0000

0000 0000 -

1111 1111

0000 0000 -

1111 1111

0x100000 -

0x10FFFF

Unicode只定义65534个码位

其中:0x100000-0x10FFFD作为专用区

现在来算一下在Unicode 5.0.0版本中实际的字符有多少个 ,只需要用总共的码位数减去平面15的专用区码位、减去平面16的专用区码位、减去平面0的专用区码位、减去平面0的代理区域码位,即是实际的字符数,238605-65534*2-6400-2048=99089,所以在Uincode5.0.0中实际表示字符的只有99089个字符。

3,什么是UTF

UTF就是Unicode Transformation Format,就是Unicode字符转换格式,包括UTF-8,UTF-16,UTF-32。

3.1,UTF和Unicode的关系

现在我们知道了Unicode就是一张字符对照表,类似于ASCII码表。UTF的作用就是将字符对应的数字按照某种格式转化为程序数据。UTF-8故名思意就是每8位保存一个字符,UTF-16顾名思意就是每16位保存一个字符,UTF-32就是每32位保存一个字符。

4,UTF-8的编码方式

UTF-8又称为可变字节编码,以字节为单位(8位)对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(十六进制) 
UTF-8 字节流(二进制)
000000-00007F
0xxxxxxx
000080-0007FF
110xxxxx 10xxxxxx
000800-00FFFF
1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 11110xxx10xxxxxx10xxxxxx10xxxxxx

UTF-8的特点是对不同范围的字符使用不同长度的编码。对于UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。

5,UTF-16的编码方式

UTF-16编码以两个字节为单位对Unicode进行编码。

对于Unicode小于0x10000的数据,UTF-16的编码与Unicode的编码相同,换句话说也就是BMP平面(平面0)中的Unicode字符编码与UTF-16的编码相同。

对于Unicode大于0x10000的数据,我们先计算Unicode编码减去0x10000,然后再将得到得到的值写成二进制形式:yyyy yyyy yyxx xxxx xxxx,最后得到该Unicode的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。

6,什么是BOM

BOM就是Btye Order Mark,即使字节顺序标记。BOM分为两种,分别是“大端”(Big Endian, BE)和“小端”(Little Endian, LE)。就是在传输数据中指定数据的顺序的协议。

7,参考文章

百度百科Unicode

Unicode和UTF-8有何区别

Unicode和UTF的关系的更多相关文章

  1. Unicode和UTF-8的关系

    Unicode和UTF-8都是表示编码,这个我一直都知道,但是这两个实际上是干什么用的,到底是怎么编码的,为什么有了Unicode还要UTF-8,它们之间有什么联系又有什么区别呢?这个问题一直困扰着我 ...

  2. Unicode 和 UTF-8 的关系

    曾经这个世界上,有着gb2312,gbk,latin1,utf 等各种字符集,现在,我们也能不时的看到他们的身影. 但是值得庆幸的事,时过境迁,这些主要的字符集,都已经逐渐被utf8取代. 但是我们很 ...

  3. 字节的高低位知识,Ascii,GB2312,UNICODE等编码的关系与来历

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理 ...

  4. ASCII Unicode UTF-8 之间的关系

    转载请标明:https://i.cnblogs.com/EditPosts.aspx?opt=1 1. ASCII ASCII 只有127个字符,表示英文字母的大小写.数字和一些符号,但由于其他语言用 ...

  5. 字符编码 ASCII、Unicode和UTF-8的关系

    摘抄自廖雪峰 教程 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机 ...

  6. Unicode、UTF-8 和 ISO8859-1

    Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...

  7. [转]Unicode和UTF-8的关系

    Unicode和UTF-8的关系作者: 张军 原文地址: http://blog.renren.com/blog/284133452/485453790 今天中午,我突然想搞清楚Unicode和UTF ...

  8. 字符编码 ASCII,Unicode和UTF-8的关系

    转自:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143166410626 ...

  9. ASCII、UNICODE、UTF

    在计算机中,一个字节对应8位,每位可以用0或1表示,因此一个字节可以表示256种情况. ascii 美国人用了一个字节中的后7位来表达他们常用的字符,最高位一直是0,这便是ascii码. 因此asci ...

随机推荐

  1. .net平台性能很不错的轻型ORM类Dapper

    dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快. 使用ORM的好处是增.删.改很快,不用自己写sql,因为这都是重复技术含量低的工作,还 ...

  2. 我不是学Java的!我不是学Java的!我不是学Java的!。。。。【自我催眠中】

    我不是学Java的!我不是学Java的!我不是学Java的!....[自我催眠中]

  3. Android 从 Android 本地图库选择多个图片

    原文地址 本文说明如何从 Android 本地图库选择多个图片.作者考虑很多解决方案. 演示从 Android 本地图库选择多个图片,有两个方法可以实现从图库中选择多个图片: 用 Intent 获取多 ...

  4. Centos7中firewalld防火锁墙的使用

    一.服务控制 启动: systemctl start firewalld 查看状态: systemctl status firewalld  停止: systemctl disable firewal ...

  5. C#中使用RabbitMQ收发队列消息

    一.程序使用NetCore.引入Nuget: Install-Package RabbitMQ.Client -Version 4.1.3 二.消息发部端: using RabbitMQ.Client ...

  6. POSTGRESQL 自动登录

    以前习惯使用MYSQL命令行登录,但是到POSTGRESQL不能实现,下面总结一下方法: 1.填写需要链接的postgresql语句,一般放在~/.bash_profile,例如: alias log ...

  7. 算法笔记_229:有理数的循环节(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 1/7 = 0.142857142... 是个无限循环小数.任何有理数都可以表示为无限循环小数的形式. 本题目要求即是:给出一个数字的循环小数表示法 ...

  8. MySQL 内存和CPU优化相关的参数

    mysql> SHOW GLOBAL STATUS LIKE 'innodb%read%'; +---------------------------------------+--------- ...

  9. Webwork【08】结合实战简析Controller 配置

    虽然现在 MVC 框架层出不穷,但做为 Struts 前身的 webwork. 其经典程度不亚于贝利之于足球,双 11 之于淘宝特卖. 本篇将结合 webwork controller 配置文件 xw ...

  10. Oracle单引号双重角色——字符串引用与转义

    单引号双重角色——字符串引用与转义      在ORACLE中,单引号有两个作用,一是字符串是由单引号引用,二是转义,开始学习时动态构成SQL时经常不解.单引号的使用是就近配对,即就近原则.而在单引号 ...