2011-07-18 43 views
10

UTF-8編碼我有從程序使用eclipse。我我的日食設置爲UTF-8,然後用輸出在java中

System.getProperty("file.encoding") 

我得到UTF-8。我跑的輸出文件的問題我的編程通過eclipse運行選項和輸出(一個文本文件)編碼爲UTF-8。但是當我將源代碼壓縮到一個jar文件中時,輸出文件顯示某些字母表中的錯誤,例如Ã。什麼是這個差異當破壞eclipse和frm jar文件中的prog時,我是否必須指定要在我的源代碼中用utf-8編碼的輸出?請幫助。

幫助@dacwe確實產生了預期的output.but可我知道我可以運行我的可執行.jar文件以外的命令行怎能-Dfile.encoding = UTF-8

@dacwe:我試着改變我的源代碼到

BufferedWriter bout = new java.io.BufferedWriter(new java.io.OutputStreamWriter(
       new java.io.FileOutputStream(filename), "UTF-8")); 

但輸出仍然沒有正確編碼。我在這裏想念的東西?

+0

[?設置默認的Java字符編碼(可能重複的HTTP ://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding) – dacwe

+1

不要這樣做!停止設置環境變量或系統屬性以設置要使用的編碼。 Java中的所有相關類都具有構造函數,它們採用編碼。在那裏指定正確的編碼,您將永遠不必再依賴外部配置。 –

+0

@dacwe我沒有提到任何在我的源代碼中使用System.setProperty(「file.encoding」,「UTF-8」)。所以通過eclipse運行我的代碼總是會產生所需的結果(UTF-8編碼文件)但不在.jar文件中。 – reukEN11

回答

1

當您從JAR文件運行時,您是否通過-Dfile.encoding設置file.encoding屬性?如果不是,您可以 或者

a)用該編碼明確打開流。爲此,您將不得不創建OutputStream,然後將其包裝在OutputStreamWriter中,以明確指示字符編碼。

b)中設定的屬性作爲第一件事在主方法使用System.setProperty( 「file.endcoding」);

note @dacwe指出了我忘了的東西...糾正了我的答案。

+0

b)不正確。您必須在JVM啓動之前設置'file.encoding'(它通過例如'String'和'OutputStreamWriter'來緩存)。 – dacwe

+0

@dacwe我使用導出爲eclipse中的.jar文件來壓縮我的源代碼。我可以準確地設置這個屬性嗎?我查看eclipse並且它有.ini文件,最後是-Dfile.encoding = UTF-8行(從教程手動從而在UTF中設置ide)。 – reukEN11

+0

@ reukEN11:*如果你沒有在程序中使用你的源代碼,它與源代碼沒有任何關係。*從一個shell啓動你的應用程序:'java -Dfile.encoding = UTF-8 -jar your-jar- file.jar'。 – dacwe

10

在@Dave G的回答中進行了一些重要討論後!

使用java -Dfile.encoding=UTF-8 -jar your-jar-file.jar的作品。

更新您的代碼爲@Dave G建議(和您的編輯)應該工作。

  • 你真的重新包裝你的jar嗎?
  • 你打電話close()bout? (例如,也許你的文件不被更新)

下面是一個完整的例子,可能讓你去:

public static void main(String... args) throws Exception { 
    PrintWriter out = new PrintWriter(new File("hello.txt"), "UTF-8"); 
    out.print("written in utf-8"); 
    out.close(); 
} 
+0

我重新包裝了.jar文件後,我的源代碼中的每一個變化,以確定輸出和bout.close()已經added.none工作,除了使用console.and什麼是我的BufferedWriter問題? – reukEN11

+0

@ reukEN11:你的'BufferedWriter'沒問題。我只想寫一個簡潔的例子。如果你閱讀文件,你也需要使用正確的編碼。 – dacwe

+0

@dacwei see.so我確實改變了mybufferedwriter來專門包含字符集set.repackaged和運行,但問題仍然存在。將繼續嘗試。 – reukEN11