将unicode写入rtf文件

我正在尝试用不同语言将字符串写入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,你可以在打开文档时选择编码和字体。

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

默认情况下,JAVA中的stings是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

DataOutputStream outStream;

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

outStream.writeBytes(strJapanese);

特别是这会失败,因为writeBytes确实会写入字节,即使你传递了一个String。 更合适的数据类型是byte[] ,但这只是Java处理字节与字符混淆的地方之一。 将字符串转换为字节的方式只需要取每个UTF-16代码单元的低8位,然后将其余部分丢弃。 这导致ISO-8859-1编码与ISO-8859-1中不存在的所有字符的乱码无意义。

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

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

 outStream.writeUTF(strJapanese); 

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

传统上来自128以上的非ASCII字符应该写成hex字节转义,如\'80 ,并指定它们的编码,如果它完全,在font \fcharset\cpg转义中,非常非常讨厌处理有,但不提供UTF-8作为选项之一。

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

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

RTF格式不是很好。

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