码迷,mamicode.com
首页 > 其他好文 > 详细

Unicode代码点与编码方式

时间:2015-09-10 23:52:03      阅读:2725      评论:0      收藏:0      [点我收藏+]

标签:

一、Unicode字符集

  UTF编码,全称是Unicode Transformer Format,这种编码是UCS(Universal Mutiple-Octet Doded Character Set,国际标准ISO10646规定的通用字符集)的实际形式,它的分类是按照其基本长度所占用的位数而定,分为UTF-8/16/32三种形式。UTF可以说是其他字符集的集合,它使得其它字符集是交叉兼容的,可以说,凡是将文字符号转为UCS后再转回原来的编码,也不会丢失信息。UCS包含了现在所有的已知语言的字符,包含从拉丁文、希腊语到中文、韩文等象形文字,再到日文的平假名、片假名等众多语系 。因此使用UTF进行程序开发,绝对是程序国际化的首选,Unicode将世界的语言统一起来,构成了最伟大的字符集。

 

二、代码点与代码单元

  代码点和代码单元,是从Unicode标准而来的术语,Unicode标准的核心是一个编码字符集。

  代码点 Code Point:与一个Unicode编码表中的某个字符对应的代码值。

  代码单元 Code Unit:一个Java中的char,可以理解为字符编码的一个基本单元。

 

三、编码方式

  Unicode编码空间从U+000000到U+10FFFF,Unicode4.0将字符分配给这1112064个代码点中的96382个代码点。 

  Unicode的编码空间划为17个平面,每个平面包含216(65536)个码位。17个平面码位可表示为“U+xx0000”到“U+xxFFFF”(xx表示十六进制从0x00到0x10,共计17个平面)。

  从U+000000至U+00FFFF之间的字符称为基本多文种平面(BMP)。这是16位编码的原始标准,早期由于错误地估算了代码点的容量范围,认为Unicode最多只需要2^16个代码点。

  其他平面为辅助平面,也就是代码点在U+10000至U+10FFFF范围之间的字符,又称为增补字符,也就是那些使用原始的Unicode的16位设计无法表示的字符。

 

四、Unicode在Java中的表示

  Java中用char来表示Unicode字符,由于刚开始Unicode最多使用16bit表示。因此char能够表示全部的Unicode字符。后来由于Unicode4.0规定Unicode支持的字符远远超过65536个字符。因此char现在不能表示所有的unicode字符。仅仅能表示0x000000到0x00FFFF之间的字符。也就是说,char不能表示增补字符。

  Java中用int表示所有Unicode代码点。int的21个低位(最低有效位)用于表示Unicode代码点,并且11个高位(最高有效位)必须为零。也就是说,int能表示出char不能表示的增补字符。

 

五、UTF-8、UTF-16、UTF-32

  UTF,是Unicode代码点的实际表示方式,按其基本长度所用位数分为UTF-8/16/32。它也可以认为是一种特殊的外部数据编码,但能够与Unicode代码点做一一对应。

  UTF-8是变长编码,每个Unicode代码点按照不同范围,可以有1-3字节的不同长度。是压缩的Unicode编码方式.

  UTF-16长度相对固定,只要不处理大于\U200000范围的字符,每个Unicode代码点使用16位即2字节表示,超出部分使用两个UTF-16即4字节表示。按照高低位字节顺序,又分为UTF-16BE/UTF-16LE。

  UTF-32长度始终固定,每个Unicode代码点使用32位即4字节表示。按照高低位字节顺序,又分为UTF-32BE/UTF-32LE。

  UTF编码有个优点,即尽管编码字节数不等,但是不像gb2312/gbk编码一样,需要从文本开始寻找,才能正确对汉字进行定位。在UTF编码下,根据相对固定的算法,从当前位置就能够知道当前字节是否是一个代码点的开始还是结束,从而相对简单的进行字符定位。不过定位问题最简单的还是UTF- 32,它根本不需要进行字符定位,但是相对的大小也增加不少。

 

  UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数。很明显,它是内部处理最方便的表达方式,但是,如果作为一般字符串表达方式,则要消耗更多的内存。

  UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码。值 U+0000 至U+FFFF 编码为一个相同值的 16位单元。增补字符编码为两个代码单元,第一个单元来自于高代理范围(U+D800 至U+DBFF),第二个单元来自于低代理范围(U+DC00至 U+DFFF)。这在概念上可能看起来类似于多字节编码,但是其中有一个重要区别:值U+D800 至 U+DFFF 保留用于 UTF-16;没有这些值分配字符作为代码点。这意味着,对于一个字符串中的每个单独的代码单元,软件可以识别是否该代码单元表示某个单单元字符,或者是否该代码单元是某个双单元字符的第一个或第二单元。这相当于某些传统的多字节字符编码来说是一个显著的改进,在传统的多字节字符编码中,字节值 0x41 既可能表示字母“A”,也可能是一个双字节字符的第二个字节。

  UTF-8 使用一至四个字节的序列对编码 Unicode 代码点进行编码。U+0000 至U+007F 使用一个字节编码,U+0080至 U+07FF 使用两个字节,U+0800 至 U+FFFF使用三个字节,而U+10000 至 U+10FFFF 使用四个字节。UTF-8 设计原理为:字节值 0x00 至0x7F 始终表示代码点U+0000 至 U+007F(Basic Latin 字符子集,它对应 ASCII 字符集)。这些字节值永远不会表示其他代码点,这一特性使 UTF-8 可以很方便地在软件中将特殊的含义赋予某些 ASCII 字符。

  下表所示为几个字符不同表达方式的比较:

Unicode 代码点

U+0041

U+00DF

U+6771

U+10400

表示字形

A

?

??(char无法识别)

UTF-32 代码单元

00000041

000000DF

00006771

00010400

UTF-16 代码单元

0041

00DF

6771

D801

DC00

UTF-8 代码单元

41

C3

9F

E6

9D

B1

F0

90

90

80

Unicode代码点与编码方式

标签:

原文地址:http://www.cnblogs.com/yuexiaohao/p/4799393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!