这些Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变更了解Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发布说明了解所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
如果一个字节数组包含非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");
当打印时,名为original
的String
将显示为:
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
程序打印出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