ad

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.3.4 Unicode 和 char类型

admin 91 2023-10-25

【摘要】 本书摘自《Java核心技术》一书中第3章,第3节,作者是来自美国的凯·S.霍斯特曼(Cay S.Horstmann),由林琪、苏钰涵等译。

3.3.4 Unicode 和 char类型

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.3.4 Unicode 和 char类型

要想弄清 char类型,就必须了解Unicode编码机制。 Unicode打破了传统字符编码机制 的限制。在Unicode出现之前,已经有许多种不同的标准:美国的ASCI、 西欧语言中的 ISO 8859-1、俄罗斯的KOI-8、 中国的GB 18030和BIG-5 等。这样就产生了下面两个问题: 一个是对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母;二是采用大字 符集的语言其编码长度有可能不同。例如,有些常用的字符采用单字节编码,而另一些字符 则需要两个或多个字节。

设计Unicode编码的目的就是要解决这些问题。在20世纪80年代开始启动统一工作时, 人们认为两个字节的代码宽度足以对世界上各种语言的所有字符进行编码,并有足够的空间 留给未来扩展,当时所有人都这么想。在1991年发布了Unicode 1.0, 当时仅占用65536个 代码值中不到一半的部分。在设计Java时决定采用16位的Unicode字符集,这比使用8位 字符集的其他程序设计语言有了很大的改进。

十分遗憾的是,经过一段时间后,不可避免的事情发生了。 Unicode字符超过了65536 个,其主要原因是增加了大量的汉语、日语和韩语中的表意文字。现在,16位的 char类型已 经不能满足描述所有Unicode 字符的需要了。

下面利用一些专用术语来解释Java语言从Java5 开始如何解决这个问题。码点(code point)是指与一个编码表中的某个字符对应的代码值。在Unicode标准中,码点采用十六进 制书写,并加上前缀U+, 例如 U+0041就是拉丁字母A 的码点。 Unicode的码点可以分成17个 代码平面 (code plane)。 第一个代码平面称为基本多语言平面 (basic multilingual plane), 包 括码点从U+0000到 U+FFFF的“经典”Unicode代码;其余的16个平面的码点为从U+10000到 U+10FFFF, 包括辅助字符 (supplementary character)。

UTF-16 编码采用不同长度的编码表示所有Unicode码点。在基本多语言平面中,每个字 符用16位表示,通常称为代码单元 (code unit); 而辅助字符编码为一对连续的代码单元。采 用这种编码对表示的各个值落入基本多语言平面中未用的2048个值范围内,通常称为替代 区域 (surrogate area)(U+D800~U+DBFF用于第一个代码单元, U+DC00~U+DFFF 用于第二个代码单 元)。这样设计十分巧妙,我们可以从中迅速知道一个代码单元是一个字符的编码,还是一 个辅助字符的第一或第二部分。例如,①是八元数集 (http://math.ucr.edu/home/baez/octonions)的一个数学符号,码点为U+10546, 编码为两个代码单元 U+D835和 U+D046。(关于编码算法的具 体描述见 https://tools.ietf.org/html/rfc2781。)

在Java 中, char类型描述了UTF-16 编码中的一个代码单元。

我们强烈建议不要在程序中使用 char类型,除非确实需要处理UTF-16 代码单元。最好 将字符串作为抽象数据类型处理(有关这方面的内容将在3.6节讨论)。

3.3.5 boolean类型

boolean (布尔)类型有两个值: false和 true, 用来判定逻辑条件。整型值和布尔值之间 不能进行相互转换。

3.4 变量与常量

与所有程序设计语言一样,Java也使用变量来存储值。常量就是值不变的变量。在下面 几节中,你会了解如何声明变量和常量。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 [email protected] 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.1 一个简单的 Java 应用程序
下一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.6.9 构建字符串
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×