【java】 Unicode和UTF的关系
2017-04-22 20:40
295 查看
目录结构:
contents structure [-]
什么是USC
UCS的编码方式
Unicode的来源
为什么需要Unicode
Unicode的方式
Unicode和UTF
UTF和Unicode的关系
UTF-8的编码方式
UTF-16的编码方式
什么是BOM
参考文章
现在来算一下在Unicode 5.0.0版本中实际的字符有多少个 ,只需要减去平面15的专用区码位,减去平面16的专用区码位,减去平面0的专用区码位,减去平面0的代理区域码位,即使,238605-65534*2-6400-2048=99089,所以在Uincode5.0.0中实际表示字符的只有99089个字符。
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。
对于Unicode小于0x10000的数据,UTF-16的编码与Unicode的编码相同,换句话说也就是BMP平面(平面0)中的Unicode字符编码与UTF-16的编码相同。
对于Unicode大于0x10000的数据,我们先计算Unicode编码减去0x10000,然后再将得到得到的值写成二进制形式:yyyy yyyy yyxx xxxx xxxx,最后得到该Unicode的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
Unicode和UTF-8有何区别
contents structure [-]
什么是USC
UCS的编码方式
Unicode的来源
为什么需要Unicode
Unicode的方式
Unicode和UTF
UTF和Unicode的关系
UTF-8的编码方式
UTF-16的编码方式
什么是BOM
参考文章
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作为专用区 |
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 |
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,参考文章
百度百科UnicodeUnicode和UTF-8有何区别
相关文章推荐
- java基础之unicode和utf-8和assci之间的关系
- Ascii,Unicode和utf-8的发展演变,java下字符和字节关系
- java中的char中unicode和utf的关系
- java中 Unicode和UTF-8的关系
- JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- 第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
- JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- gbk, gb2312,big5,unicode,utf-8,utf-16之间的关系
- 第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- Unicode和UTF-8之间的关系
- gbk, gb2312,big5,unicode,utf-8,utf-16之间的关系
- java unicode to utf-8
- Java中的ASCII、Unicode和UTF-8字符编码集
- gbk, unicode, utf-8的关系
- JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- 转: JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础[引]
- JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- ASCII,Unicode,UTF-8,GB2312编码之间的关系