2011-06-05 49 views
3

我試圖用Java打造一箇中國識字計劃,以幫助自己學習中國啓動的程序。我正在使用intelliJ IDEA 10.基本過程是,我的程序將讀取保存在本地計算機上的文件以生成插卡。該文件使用java中的File類編寫。在記事本中打開時,它會正確顯示所有字符。特殊字符的Java IDE顯示正確的,但不能從jar文件

當我在IDE中運行它,我能夠顯示中國文字和拼音字符(基本上超過他們重音符號的元音)。但是,當我創建一個jar文件並從那裏啓動程序時,它不能再顯示特殊字符,並最終顯示一堆奇怪的符號。

上這是爲什麼,以及如何解決它的任何想法?

回答

4

的IntelliJ不使用平臺默認的編碼,它autodetects它基於源文件的編碼。在IntelliJ之外運行代碼時,需要確保在讀取/寫入文件時明確指定正確的編碼。你可以通過指定它作爲第二個構造函數參數InputStreamReaderOutputStreamWriter分別做到這一點。

File file = new File("/foo.txt"); 
Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8"); 
// ... 

Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); 
// ... 

此外,您還需要確保查看器支持字體。例如,Windows命令控制檯不支持中文。您需要創建一個Swing應用程序來呈現結果。

+0

這是問題。我在實施解決方案時唯一注意到的是你有一個輕微的錯字。它應該是 新的InputStreamReader(新的FileInputStream(文件),「UTF-8」); 本質上,它移動了一個括號,以便「UTF-8」是InputStreamReader類的一個參數。謝謝您的幫助! – jhlu87 2011-06-05 17:52:04

+0

不客氣。你錯了,我解決了。我太習慣於'新的InputStreamReader(輸入,「UTF-8」)':)的形式 – BalusC 2011-06-05 17:55:38

+0

Windows不支持UTF-8?請告訴我你開玩笑吧!如果它是假的,那是一個冒犯性的笑話,如果它是真的,那更是如此。 – tchrist 2011-06-05 18:15:33

0

也許這是一個編碼問題?

File類不具備將數據寫入文件的任何方法。爲此,您需要一個FileOutputStream或一些Writer。您應該發佈保存文件的代碼。 (編輯這個問題,並添加您的代碼中有)。

我的第一個猜測是,你使用FileWriter。這聽起來很容易,但它往往是錯誤的,因爲FileWriter需要將字符轉換爲字節,並且它與系統的默認編碼一樣。你應該總是自己指定編碼,並且可能UTF-8是一個不錯的選擇。

因此而不是FileWriter,你應該使用下面的代碼:

Charset utf8 = Charset.forName("UTF-8"); 
OutputStream os = new FileOutputStream(file); 
try { 
    Writer wr = new OutputStreamWriter(os, utf8); 
    wr.write("whatever strings you want to write"); 
    wr.close(); 
} finally { 
    os.close(); 
}