文档

Java™ 教程-Java Tutorials 中文版
字节编码和字符串
Trail: Internationalization
Lesson: Working with Text
Section: Converting Non-Unicode Text

字节编码和字符串

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

打印时,名为 originalString 显示为:

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 数组中的值,以证明重要的一点:转换后的文本的长度可能不与源文本的长度相同。一些 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

Previous page: Converting Non-Unicode Text
Next page: Character and Byte Streams