2017-02-21 188 views
4

我在Java文件編碼方面遇到問題。Java以文件名保存帶有特殊字符的文件

我有一個Java程序將一個輸入流保存爲一個給定的文件名的文件,代碼片段是這樣的:

File out = new File(strFileName); 
Files.copy(inStream, out.toPath()); 

它工作正常的Windows,除非文件名中包含一些特殊字符,如Ö,這些字符在文件名中,保存的文件將在Windows上顯示亂碼的文件名。

據我所知,通過應用JVM選項-Dfile.encoding=UTF-8這個問題可以修復,但我會在我的代碼中有一個解決方案,而不是要求我的所有用戶更改他們的JVM選項。

在調試程序時,我可以看到文件名字符串總是顯示正確的字符,所以我猜這個問題不是關於內部編碼。

請問有人能解釋幕後出了什麼問題嗎?有沒有一種方法來編程避免這個問題?我試圖從字符串中獲取字節並更改編碼,但它不起作用。

謝謝。

+0

是否設置'-Dfile.encoding'選項實際上解決這個問題?因爲在從文件讀取時使用它,而不是爲文件名本身。你從哪裏得到文件名字符串? – Thilo

+0

看來參數確實也會影響文件名的編碼方式:http://stackoverflow.com/questions/9196950/setting-file-name-encoding – Thilo

+0

@Thilo是的,JVM選項適用於這個問題。當我用瑞典文件名測試時發現問題。 –

回答

0

使用URLEncoder class將工作:

String name = URLEncoder.encode("fileName#", "UTF-8"); 
File output = new File(name); 
+0

真的嗎?這似乎不太可能。 – Thilo

+0

這是一個近似值,它需要一個解碼器操作才能獲得特殊字符 –

+0

您是否有鏈接解釋了Windows文件系統API如何對URL編碼進行特殊處理?還要注意,這個問題清楚地表明,只需將'file.encoding'設置爲與操作系統希望查看文件名的字符集相匹配即可解決問題。 – Thilo

相關問題