a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 123|回复: 0

[专业语言] Java认证:Java中编码以及Unicode总结(5)

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
4、( f2 S: \- f# W$ ?1 {6 w
  Unicode的编码形式' ~) S3 |0 \" N! s! S
  4.1 Unicode字符集8 C) g* \0 ^6 m2 a) a0 B
  Unicode字符集编码是Universal Multiple-Octet Coded Character Set 通用多八位编码字符集的简称,是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符
* i8 R. y+ K* ?$ A. G  H  编码系统,撑呈现今世界各类分歧说话的书面文本的交流、措置及显示。该编码于1990年起头研发,1994年正式发布,最新版本是2005年3 月31日的 Unicode 4.1.0。Unicode是一种在计较机上使用的字符编码。它为每种说话中的每个字符设定了统一而且独一的二进制编码,以知足跨说话、跨平台进行文本转换、措置的要求。Unicode 尺度始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,例如字母“A”的编码为 004116,所以“A”的编码书写为“U+0041”。- x  P' J: H+ Y0 \8 m' L% ?
  7
" B( a  N5 }+ U3 ?8 [! H3 L5 j* B  此刻的Unicode码空间为U+0000到U+10FFFF,一共1114112个码位,其中只有1,112,064 个码位是正当的(我来替你做算术,有2048个码位不正当),但并不是说此刻的Unicode就有这么多个字符了,现实上其中良多码位仍是余暇的,到 Unicode 4.0 规范为止,只有96,382个码位被分配了字符(但无论若何,仍比良多人认为的65536个字符要多得多了)。其中U+0000 到U+FFFF的部门被称为根基多说话面(Basic Multilingual Plane,BMP)。U+10000及以上的字符称为填补字符。在Java中(Java1.5 之后),填补字符使用两个char型变量来暗示,这两个 char型变量就组成了所谓的surrogate pair(在底层现实上是使用一个int进行暗示的)。第一个char型变量典型围称为“高代办代庖部门”(high-surrogates range,从”uD800到”uDBFF,共1024个码位), 第二个char型变量典型围称为low-surrogates range(从”uDC00到”uDFFF,共1024个码位),这样使用surrogate pair可以暗示的字符数一共是1024的平方计1048576个,加上BMP的65536个码位,去失踪2048个犯警的码位,正好是1,112,064 个码位。
% w8 n9 q/ u: c1 t8 t5 H  关于Unicode的码空间现实上有一些稍不小心就会让人犯错的处所。好比我们都知道从U+0000到U+FFFF的部门被称为根基多说话面(Basic Multilingual Plane,BMP),这个规模内的字符在使用UTF-16编码时,只需要一个char型变量就可以保留。细心看看这个规模,应该有65536这么大,是以你会说单字节的UTF-16编码能够暗示65536个字符,你也会说Unicode的根基多说话面包含65536个字符,可是再想想适才说过的 surrogate pair,一个UTF-16暗示的填补字符(再一次的,需要两个char型变量才能暗示的字符)若何才能被正确的识别为填补字符,而不是两个通俗的字符呢?谜底你也知道,就是经由过程看它的第一个char是不是在高代办代庖规模内,第二个char是不是在低代办代庖规模内来抉择,这也意味着,高代办代庖和低代办代庖所占的共 2048个码位(从0xD800到0xDFFF)是不能分配给其他字符的。但这是对UTF-16这种编码体例而言,而对Unicode这样的字符集呢?在 Unicode的编号中,U+D800到U+DFFF是否有字符分配?谜底是也没有!这是典型的字符集为便利编码体例而做的放置(你问他们这么做的目的?当然是但愿根基多说话面中的字符和一个char型的UTF-16编码的字符能够一一对应,少些麻烦,从中我们也能看出UTF-16与Unicode间很深的渊源与连系)。也就是说,无论Unicode仍是UTF-16编码后的字符,在0×0000至0xFFFF这个规模内,只有63488个字符。这就好比最初的CPU被勉强拿来做多媒体应用,用得多了,CPU就不得不批改自己从硬件上对多媒体应用供给撑持了。$ @. y3 N: l4 h3 k+ U7 X
  尽管不情愿,但说到这里总还得扯扯相关的概念:代码点和代码单元。代码点(Code Point)就是指Unicode中为字符分配的编号,一个字符只占一个代码点,例如我们说到字符“汉”,它的代码点是U+6C49.代码单元(Code Unit)则是针对编码体例而言,它指的是编码体例中对一个字符编码往后所占的最小存储单元。例如UTF-8中,代码单元是一个字节,因为一个字符可以被编码为1个,2个或者3个4个字节;在UTF-16中,代码单元酿成了两个字节(就是一个 char),因为一个字符可以被编码为1个或2个char(你找不到比一个char还小的UTF-16编码的字符,嘿嘿)。说得再罗嗦一点,一个字符,仅仅对应一个代码点,但却可能有多个代码单元(即可能被编码为2个char)。以上概念绝非学术化的绕口令,这意味着当你想以一种统一的体例指定自己使用什么字符的时辰,使用代码点(即你告诉你的轨范,你要用Unicode中的第几个字符)老是比使用代码单元更好(因为这样做的话你还得区分情形,有时辰供给一个16进制数字,有时辰要供给两个)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-29 22:42 , Processed in 0.139787 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表