信息编码:字符串和文本
字符串和文本
历史悠久的文本(可打印,即可显示的字符串)可能是用来表示信息最常用的方式。文本使用起来非常方便,因为人们习惯于处理各种各样以字符串形式表示的信息,如书本中,报纸中,以及电脑显示器上的信息。因此,只要我们指定如何对要传输的文本进行编码,我们就几乎能发送其他任何类型的数据:先将其表示成文本形式,再对文本进行编码。显然,我们可以将数字和boolean类型的数据表示成String类型,如"123478962","6.02e23","true","false"等。我们也已经看到,通过调用getBytes()方法,可以将一个字符串转换成字节数组(见TCPEchoClient.java)。当然,还有其他方法实现这个功能。
为了更好地理解这个过程,我们首先得将文本视为由符号和字符(characters)组成。实际上每个String实例都对应了一个字符序列(数组,char[]类型)。一个字符在Java内部表示为一个整数。例如,字符"a",即字母"a"的符号,与整数97对应;字符"X"对应了88,而符号"!"(感叹号)则对应了33。
在一组符号与一组整数之间的映射称为编码字符集(coded character set.)。或许你听说过ASCII编码字符集(ASCII,American Standard Code for Information Interchange,美国标准信息交换码)。ASCII码将英语字母、数字、标点符号以及一些特殊符号(不可打印字符)映射成0到127的整数。自20世纪60年代以来,ASCII码就被用来进行数据传输,甚至在今天,它也广泛应用在应用程序协议中,如HTTP(万维网所用的协议)。然而,由于它忽略了许多英语以外的其他语言所使用的符号,在如今全球化经济环境下,使用ASCII码来开发应用程序和设计协议就显得不够理想。
因此,Java使用了一种称为Unicode的国际标准编码字符集来表示char型和String型值。Unicode字符集将"世界上大部分的语言和符号"[ ]映射到整数0至65535之间,能更好地适用于国际化程序。例如,日文平假名中代表音节"o"的符号映射成了整数12362。Unicode包含了ASCII码:每个ASCII码中定义的符号在Unicode中所映射整数与其在ASCII码中映射的整数相同。这就为ASCII与Unicode之间提供了一定程度的向后兼容性。
发送者与接收者必须在符号与整数的映射方式上达成共识,才能使用文本信息进行通信。这就是他们所要达成一致的所有内容吗?还得根据情况而定。对于每个整数值都比255小的一小组字符,则不需要其他信息,因为其每个字符都能够作为一个单独的字节进行编码。对于可能使用超过一个字节的大整数的编码方式,就有多种方式在线路上对其进行编码。因此,发送者和接收者还需要对这些整数如何表示成字节序列统一意见,即编码方案(encodingscheme)。编码字符集和字符的编码方案结合起来称为字符集(charset,见RFC 2278)。你也可以定义自己的字符集,但没有理由这样做,世界上已经有大量不同的标准(standardized)字符集在使用。Java提供了对任意字符集的支持,而且每种实现都必须支持以下至少一种字符集:US-ASCII(ASCII的另一个名字),ISO-8859-1,UTF-8,UTF-16BE,UTF-16LE,UTF-16。
调用String实例的getBytes()方法,将返回一个字节数组,该数组根据平台默认字符集(default charset)对String实例进行了编码。很多平台的默认字符集都是UTF-8,然而在一些经常使用ASCII字符集以外的字符的地区,情况有所不同。要保证一个字符串按照特定(particular)字符集编码,只需要将该字符集的名字作为参数(String类型)传递给getBytes()方法,其返回的字节数组就包含了由指定字符集表示的字符串。(注意,在第2.2.1节的TCP回显客户端/服务器示例程序与编码是无关的,因为它们根本没有对接收到的数据进行解释。)
下面举例来对getBytes()方法进行说明。如果在著作本书的平台上调用"Test!".getBytes(),你将获得按照UTF-8字符集编码的字节数组;然而如果你调用"Test!".getBytes("UTF-16BE"),
你将得到如下数组:在这种情况下每个值被编码成了两个字节的序列,高位在前;
如果调用 "Test!".getBytes("IBM037"),返回结果将是:
上面的例子说明,发送者和接收者必须在文本字符串的表示方式上达成共识。最简单的方法就是定义一个标准字符集。
我们知道,可以通过先将字符串转换成独立的字节,再将其写到流中的方式,把String写入到OutputStream中去。这个方法在每次调用getBytes()方法时,都得指定编码方式。在本章后续内容中,我们将看到只需要简单指定一次编码就能构建文本消息的方法。
相关下载:
Java_TCPIP_Socket编程(doc)
http://download.csdn.net/detail/undoner/4940239
文献来源:
UNDONER(小杰博客) :http://blog.csdn.net/undoner
LSOFT.CN(琅软中国) :http://www.lsoft.cn