2011-10-25 151 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