字节编码和字符串
如果字节数组包含非 Unicode 文本,则可以使用String
构造函数方法之一将文本转换为 Unicode。相反,您可以使用String.getBytes
方法将String
对象转换为非 Unicode 字符的字节数组。当调用这两种方法时,您可以将编码标识符指定为参数之一。
下面的示例在 UTF-8 和 Unicode 之间转换字符。 UTF-8 是 Unicode 的传输格式,对于 UNIX 文件系统来说是安全的。该示例的完整源代码在文件StringConverter.java中。
StringConverter
程序首先创建一个包含 Unicode 字符的String
:
String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");
打印时,名为String
的String
显示为:
AêñüC
要将String
对象转换为 UTF-8,请调用getBytes
方法并指定适当的编码标识符作为参数。 getBytes
方法以 UTF-8 格式返回字节数组。要从非 Unicode 字节数组创建String
对象,请使用 encoding 参数调用String
构造函数。如果不支持指定的编码,则进行这些调用的代码包含在try
块中:
try {
byte[] utf8Bytes = original.getBytes("UTF8");
byte[] defaultBytes = original.getBytes();
String roundTrip = new String(utf8Bytes, "UTF8");
System.out.println("roundTrip = " + roundTrip);
System.out.println();
printBytes(utf8Bytes, "utf8Bytes");
System.out.println();
printBytes(defaultBytes, "defaultBytes");
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
StringConverter
程序打印出utf8Bytes
和defaultBytes
数组中的值,以说明重要的一点:转换后的文本的 Long 度可能与源文本的 Long 度不同。一些 Unicode 字符转换为单个字节,其他的则转换为成对或三重字节。
printBytes
方法通过调用byteToHex
方法来显示字节数组,该方法在源文件UnicodeFormatter.java中定义。这是printBytes
方法:
public static void printBytes(byte[] array, String name) {
for (int k = 0; k < array.length; k++) {
System.out.println(name + "[" + k + "] = " + "0x" +
UnicodeFormatter.byteToHex(array[k]));
}
}
printBytes
方法的输出如下。请注意,两个数组中只有前一个字节和最后一个字节(A 和 C 字符)相同:
utf8Bytes[0] = 0x41
utf8Bytes[1] = 0xc3
utf8Bytes[2] = 0xaa
utf8Bytes[3] = 0xc3
utf8Bytes[4] = 0xb1
utf8Bytes[5] = 0xc3
utf8Bytes[6] = 0xbc
utf8Bytes[7] = 0x43
defaultBytes[0] = 0x41
defaultBytes[1] = 0xea
defaultBytes[2] = 0xf1
defaultBytes[3] = 0xfc
defaultBytes[4] = 0x43