文档

Java™ 教程
隐藏目录
字节编码和字符串
路径:国际化
课程:处理文本
章节:转换非Unicode文本

字节编码和字符串

如果一个字节数组包含非Unicode文本,你可以使用String构造方法之一将文本转换为Unicode。反之,你可以使用String.getBytes方法将String对象转换为非Unicode字符的字节数组。在调用这两个方法时,你需要指定编码标识符作为参数之一。

下面的示例将字符在UTF-8和Unicode之间进行转换。UTF-8是一种对UNIX文件系统安全的Unicode传输格式。示例的完整源代码在文件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对象,调用带有编码参数的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

上一页: 转换非Unicode文本
下一页: 字符和字节流