2013-03-01 29 views
0

我想使用openConnection下載並保存xml文件。openConnection使用UTF-8獲取xml

問題是,當我保存文件,有錯誤的字符集。

我的代碼是:

URL url = new URL(partnersEntity.getUrl()); 

      URLConnection urlConnection = url.openConnection(); 
      urlConnection.setRequestProperty("Content-Length", "500000"); 
      urlConnection.setRequestProperty("Accept-Charset", "UTF-8"); 
      urlConnection.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); 


      Calendar calendar = Calendar.getInstance(); 
      Date now = calendar.getTime(); 
      Timestamp currentTimestamp = new Timestamp(now.getTime()); 

      File file = new File(myFile); 

      FileWriter writer = new FileWriter(file); 

      IOUtils.copy(urlConnection.getInputStream(), writer); 
      writer.close(); 

後,在我的文件,我看到痕跡,如 「??」在特殊的包機地方。

我應該改變什麼?

回答

2

不要在這種情況下使用讀/寫器,離開XML原樣。

 FileOutputStream out = new FileOutputStream(file); 

     IOUtils.copy(urlConnection.getInputStream(), out); 

通過使用FileWriter,您正在使用平臺默認字符集編寫xml數據,而這絕不是您想要的。始終將xml視爲二進制數據,而不是文本數據

1

(1)檢查您正在閱讀的資源是否屬於UTF-8。您請求使用「Accept-Charset」,但不保證。然而。我們假設它是UTF-8。

(2)指定您正在使用的作者的字符集。通過使用FileWriter,您可以獲得運行環境的「默認」字符集......可能不是UTF-8。更好的是使用OutputStreamWriter。

OutputStream os = new OutputStream(file); 
OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8"); 

(3)告訴複製如何解釋輸入流:

IOUtils.copy(urlConnection.getInputStream(), writer, "UTF-8"); 
+0

由於他*將數據作爲二進制流獲取並且只是想寫入一個文件,根本不需要涉及'Writer'或編碼:他應該將它寫成流(就像@jtahlborns answer顯示)。 – 2013-03-01 15:15:56

+0

是的,你是對的。將它作爲字節流保留得更加優雅。希望我想到了這一點....但是,如果你確實想要處理字符(並且有些情況下你想這樣做),那麼這裏的教訓是明確地說明字符編碼,而不要使用FileWriter。 – AgilePro 2013-03-01 15:18:53