2013-03-01 2 views
0

Я хочу загрузить и сохранить файл xml с помощью openConnection.openConnection получить xml с UTF-8

Проблема в том, что когда я сохраняю файл, есть неправильная кодировка.

Мой код:

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 отвечает показывает). –

+0

Да, вы правы. Гораздо более элегантно оставить его в виде байтового потока. Хотел бы я подумать об этом ... Однако, если вы хотите обработать символы (и есть некоторые случаи, когда вы хотите это сделать), урок здесь должен быть явным в кодировке символов и никогда не использовать FileWriter. – AgilePro