2

我正在尝试将不同语言的字符串写入 rtf 文件。我尝试了一些不同的东西。我在这里以日语为例,但我尝试过的其他语言也是如此。

public void writeToFile(){

    String strJapanese = "日本語";
    DataOutputStream outStream;
    File file = new File("C:\\file.rtf");

    try{

        outStream = new DataOutputStream(new FileOutputStream(file));
        outStream.writeBytes(strJapanese);
        outStream.close();

    }catch (Exception e){
        System.out.println(e.toString());
    }
}

我也试过:

byte[] b = strJapanese.getBytes("UTF-8");
String output = new String(b);

或更具体:

byte[] b = strJapanese.getBytes("Shift-JIS");
String output = new String(b);

输出流也有 writeUTF 方法:

outStream.writeUTF(strJapanese);

您可以通过 write 方法直接在输出流中使用 byte[]。除西欧语言外,以上所有内容都为我提供了乱码。为了查看它是否有效,我尝试在 notepad++ 中打开结果文档并设置适当的编码。我还使用过 OpenOffice,您可以在打开文档时选择编码和字体。

如果它确实有效但我的电脑无法正常打开它,有没有办法检查?

4

3 回答 3

3

数据输出流输出流;

您可能不希望 DataOutputStream 用于编写 RTF 文件。DataOutputStream 用于将二进制结构写入文件,但 RTF 是基于文本的。通常是一个 OutputStreamWriter,在构造函数中设置适当的字符集将是写入文本文件的方式。

outStream.writeBytes(strJapanese);

特别是这会失败,因为writeBytes确实会写入字节,即使您将其传递给字符串。一个更合适的数据类型应该是byte[],但这只是 Java 处理字节与字符令人困惑的地方之一。它将字符串转换为字节的方式很简单,就是获取每个 UTF-16 代码单元的低 8 位,然后丢弃其余的。这会导致 ISO-8859-1 编码对于 ISO-8859-1 中不存在的所有字符都是乱码。

byte[] b = strJapanese.getBytes("UTF-8");
String output = new String(b);

这并没有真正做任何有用的事情。您编码为 UTF-8 字节,然后使用默认字符集将其解码回字符串。触摸默认字符集几乎总是一个错误,因为它在不同的机器上是不可预测的。

outStream.writeUTF(strJapanese);

这将是编写 UTF-8 的一个更好的尝试,但它仍然不太正确,因为它使用 Java 的虚假“修改后的 UTF-8”编码,更重要的是 RTF 文件实际上并不支持 UTF-8,也不应该真的支持直接包含任何非 ASCII 字符。

传统上,从 128 开始的非 ASCII 字符应该写成十六进制字节转义,\'80如UTF-8 作为选项之一。\fcharset\cpg

在更现代的 RTF 中,您可以\u1234x像 Dabbler 的回答 (+1) 那样逃脱。每个转义编码一个 UTF-16 代码单元,它对应于一个 Java char,因此用它们的转义变体正则表达式替换所有非 ASCII 字符并不难。

Word 97 及更高版本支持此功能,但其他一些工具可能会忽略 Unicode 并回退到x替换字符。

RTF 不是一个很好的格式。

于 2011-10-25T20:00:59.937 回答
3

默认情况下,JAVA 中的字符串是 UTF-8 (unicode),但是当你想写下来时,你需要指定编码

try {
    FileOutputStream fos = new FileOutputStream("test.txt");
    Writer out = new OutputStreamWriter(fos, "UTF8");
    out.write(str);
    out.close();
} catch (IOException e) {
    e.printStackTrace();
}

参考:http: //download.oracle.com/javase/tutorial/i18n/text/stream.html

于 2011-10-25T20:01:48.473 回答
2

\u您可以使用控制字编写任何以十进制数表示的 Unicode 字符。例如\u1234?,将表示 Unicode 代码点为 1234 的字符,并且?是无法充分表示字符的情况下的替换字符(例如,因为字体不包含它)。

于 2011-10-25T19:44:08.160 回答