本节书摘来自异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.1节ASCII和Unicode,作者 【加】Budi Kurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看
第2章 语言基础
Java和Android开发学习指南(第2版)
Java是一种面向对象编程语言,因此,理解OOP非常重要。第4章是本书的第一个关于OOP内容的一章。然而,在了解OOP功能和技术之前,应该先学习Java语言的基础知识。
2.1 ASCII和Unicode
传统上,英语国家的计算机只使用美国信息交换标准代码(American Standard Code for Information Interchange,ASCII)字符来表示字母和数字字符。ASCII中的每个字符都用7位来表示。因此,这个字符集中有128个字符。其中包括小写和大写的拉丁字母、数字和标点符号。
ASCII字符集后来扩展了,包括了另外的128个字符,例如,德语字符ä、ö、ü和英国货币符号£。这个字符集叫作扩展了的ASCII,并且每个字符使用8位来表示。
ASCII和扩展的ASCII只是可用的众多字符集中的两个。另一个流行的字符集由国际标准化组织(International Standards Organization,ISO)标准化了,即ISO-8859-1,也称之为Latin-1。ISO-8859-1中的每一个字符也用8位来表示。这个字符集包含了很多西方语言(如德语、丹麦语、荷兰语、法语、意大利语、西班牙语、葡萄牙语,当然也包括英语)编写文本所需的所有字符。每个字符占8位的字符集便于使用,因为一个字节也是8位的长度。因此,用一个8位的字符集来存储和传输文本,也更有效率。
然而,并不是每种语言都使用Latin字母。中文和日文是使用不同的字符集的两个例子。例如,中文中的每个字符表示一个字,而不是一个字母。这样的字符有数千个,8位不足以表示字符集中的所有字符。日文也使用一种不同字符集。全部算起来,全世界的语言中,有数以百计的不同的字符集。为了统一所有字符集,创建了一个叫作Unicode的计算标准。
Unicode是由一个叫作Unicode联盟(Unicode Consortium,www.unicode.org)的非营利的组织开发的。这个实体试图将全世界所有语言的所有字符,都包含到一个单个的字符集中。Unicode中的一个唯一的编号,只表示1个字符。Unicode当前的版本8,用于Java、XML、ECMAScript和LDAP等。
一开始,一个Unicode字符用16位来表示,这足够表示65 000多个不同的字符。65 000字符足以表示世界上主要语言中的大多数字符了。然而,Unicode联盟计划支持100万个以上的字符编码。根据这个数量,可能还需要另外的16位才能表示每个字符。实际上,32位系统被认为是存储Unicode字符的一种方便的方式。
现在,你已经看到了一个问题。尽管Unicode为所有语言中的所有字符提供了足够的空间,但是,存储和传输Unicode文本并不像存储和传输ASCII或Latin-1字符那样高效。在互联网世界中,这是一个大问题。想象一下,你要传输的数据是ASCII文本的4倍那么多。
好在字符编码可以使得存储和传输Unicode文本更加高效。你可以把字符编码看作是和数据压缩类似。并且,如今有很多类型的字符编码可用。Unicode联盟支持如下3种:
UTF-8。这在HTML中很流行,并且用作将Unicode字符转换为不同长度的字节编码的协议。它利用了一个优点,即Unicode字符与人们熟悉的ASCII具有相同的字节值。转换为UTF-8的Unicode字符可以用于很多已有的软件。大多数浏览器都支持UTF-8字符编码。
UTF-16。在这一字节编码中,所有较为常用的字符都放入到单个的16位的编码单元中,其他较少用到的字符,通过一对16位的编码单元来访问。
UTF-32。这个字节编码为单个的字符使用32位。这显然不是Internet应用程序的选择,至少目前还不是。
ASCII字符仍然在软件编程中扮演主要的角色。Java对于几乎所有的输入元素都使用ASCII,除了注释、标识符以及字符和字符串内容之外。对于后者,Java支持Unicode字符。这意味着,你可以用英语以外的语言来编写注释、标识符和字符串。