Java国际化:与Unicode相互转换

时间:2020-01-09 10:35:37  来源:igfitidea点击:

在Java内部,所有字符串都保存为Unicode。由于并非从用户或者外界收到的所有文本都使用unicode,因此应用程序可能必须从非unicode转换为unicode。此外,当应用程序输出文本时,它可能必须将内部unicode格式转换为外界所需的任何格式。

Java有几种不同的方法可用于将文本与Unicode相互转换。这些方法是:

  • String
  • ReaderWriter类和子类

我将在以下各节中介绍这两种方法。

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字符集。