Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
如果字节数组包含非 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");
打印时,名为 original
的 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
数组中的值,以证明重要的一点:转换后的文本的长度可能不与源文本的长度相同。一些 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