2011-10-25 124 views
2

我正在尝试将不同语言的字符串写入rtf文件。我已经尝试了几个不同的东西。 我在这里使用日语作为例子,但对于我尝试过的其他语言也是如此。将unicode写入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()); 
    } 
} 

我ALSE曾尝试:

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); 

可以使用字节[]直接在输出流中写入方法。除西欧语言外,上述所有内容都给我提供了一些乱码。要查看它是否有效我已经尝试在记事本++中打开结果文档并设置适当的编码。此外,我使用OpenOffice,您可以在打开文档时选择编码和字体。

如果它能工作,但我的电脑无法正常打开,有没有办法检查?

回答

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

+0

作品,我用“Shift-JIS”代替“UTF-8”进行编码。谢谢。 – Oglop

2

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

3

DataOutputStream outStream;

您可能不希望DataOutputStream用于编写RTF文件。 DataOutputStream用于将二进制结构写入文件,但RTF是基于文本的。通常情况下,OutputStreamWriter将设置适当的字符集in the constructor作为写入文本文件的方式。

outStream.writeBytes(strJapanese);

尤其是因为writeBytes确实会写入字节,即使您将它传递给String也是如此。一个更合适的数据类型应该是byte[],但这只是Java处理字节与字符混淆的地方之一。它将字符串转换为字节的方式就是简单地将每个UTF-16编码单元的低八位取出,然后丢弃其余部分。这导致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,并为他们的编码规定,如果在所有的,在字体\fcharset\cpg逃逸是非常,非常讨厌处理与,并且不提供UTF-8作为选项之一。

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

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

RTF不是一个很好的格式。

+0

令人印象深刻的回答。我选择RTF的原因是,我希望能够将UI中的文本写入一些更能呈现于TXT中的文本,并且不依赖于平台,并且与任何许可证绑定为PDF保存功能的补充。希望这会奏效。 – Oglop