zoukankan      html  css  js  c++  java
  • Unicode和UTF的关系

    目录结构:

    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有何区别

  • 相关阅读:
    关于lockkeyword
    关于多层for循环迭代的效率优化问题
    Android 面试精华题目总结
    Linux基础回想(1)——Linux系统概述
    linux源代码编译安装OpenCV
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem B. Matrix Fast Power
    校赛热身 Problem B. Matrix Fast Power
    集合的划分(递推)
  • 原文地址:https://www.cnblogs.com/HDK2016/p/6748593.html
Copyright © 2011-2022 走看看