Java国际化:与Unicode相互转换
在Java内部,所有字符串都保存为Unicode。由于并非从用户或者外界收到的所有文本都使用unicode,因此应用程序可能必须从非unicode转换为unicode。此外,当应用程序输出文本时,它可能必须将内部unicode格式转换为外界所需的任何格式。
Java有几种不同的方法可用于将文本与Unicode相互转换。这些方法是:
String
类Reader
和Writer
类和子类
我将在以下各节中介绍这两种方法。
UTF-8
首先,我想澄清一下,Unicode由一组"代码点"组成,这些代码点基本上是与给定字符相对应的数字值。有几种方法可以将这些代码点(数值)"编码"为字节。最常见的两个是UTF-8和UTF-16. 在本教程中,我将仅显示转换为UTF-8的示例,因为这似乎是最常用的Unicode编码。
使用String类在Unicode UTF-8之间进行转换
我们可以使用String类将字节数组转换为String实例。我们可以使用String
类的构造函数来实现。这是一个例子:
byte[] bytes = new byte[10]; String str = new String(bytes, Charset.forName("UTF-8")); System.out.println(str);
本示例首先创建一个字节数组。字节数组实际上并不包含任何有意义的数据,但是出于示例的目的,这无关紧要。然后,该示例创建一个新的String,将字节数组和字节数组中字符的字符集作为参数传递给构造函数。然后,String
构造函数会将字节从字节数组的字符集转换为unicode。
我们可以使用getBytes()方法将String的文本转换为另一种格式。这是一个例子:
bytes[] bytes = str.getBytes(Charset.forName("UTF-8"));
我们也可以通过使用\ u转义,直接在代码的字符串中编写unicode字符。这是一个例子:
// The danish letters Æ Ø Å String myString = "\u00C6\u00D8\u00C5" ;
使用Reader和Writer类在Unicode UTF-8之间进行转换
" Reader"和" Writer"类是面向流的类,使Java应用程序可以读写字符流。我的Java IO教程中都对这两个类进行了说明。转到读者或者作家以阅读更多内容。
这是一个使用InputStreamReader来将某个字符集(UTF-8)转换为unicode的示例:
InputStream inputStream = new FileInputStream("c:\data\utf-8-text.txt"); Reader reader = new InputStreamReader(inputStream, Charset.forName("UTF-8")); int data = reader.read(); while(data != -1){ char theChar = (char) data; data = reader.read(); } reader.close();
本示例创建一个FileInputStream并将其包装在InputStreamReader中。告诉InputStreamReader将文件中的字符解释为UTF-8字符。这是通过使用InputStreamReader类中的第二个构造函数参数完成的。
这是将字符流写回UTF-8的示例:
OutputStream outputStream = new FileOutputStream("c:\data\output.txt"); Writer writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8")); writer.write("Hello World"); writer.close();
这个例子创建了一个OutputStreamWriter,它将通过它写入的字符串转换为UTF-8字符集。