字节编码和字符串

如果字节数组包含非 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");

打印时,名为StringString显示为:

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程序打印出utf8BytesdefaultBytes数组中的值,以说明重要的一点:转换后的文本的 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