2012-12-17 2 views
0

Я пишу приложение rss reader для Android, и теперь мне нужно знать, что такое кодировка xml, прежде чем начать его разбор (windows-1251 или utf-8). Это описано в заголовке объявления xml, то есть <?xml version="1.0" encoding="UTF-8"?>. Как я могу получить этот заголовок перед разбором? Я использую android.sax реализацию сакса-парсера и передаю кодировку в качестве строкового параметра InputStreamReader. Я нашел связанный с этим вопрос: SAX Parser doesn't recognize windows-1255 encoding - но решение для преобразования cp-1251 в utf-8, которое слишком громоздко и требует ресурсов. Я думаю, что должно быть лучшее решение, так как мне нужно знать только значение кодировки из заголовка <?xml version="1.0" encoding="UTF-8"?>. Но я не могу получить этот заголовок из xml, синтаксический анализатор начинается с тега <rss>. Как мне это получить?Как получить заголовок объявления XML? Android

+0

** «Как я могу получить этот заголовок перед разбором?» ** - Откройте XML-файл в виде текстового файла и прочитайте первую строку и проверьте «encoding =« UTF-8 »« возможно »? Просто мысль. – Squonk

+0

Это очевидный и правильный ответ на проблему. По какой-то причине я искал что-то более сложное :) – Cass

ответ

0

Я бы рекомендовал перейти на официально поддерживаемый Android xmlPullParser, и проблема с поддержкой кодирования должна исчезнуть.

Это Android doc на нем.

Не думай легкомысленно это как SAX парсер не работает в Android v3.0 +

+0

Спасибо, может быть, я перейду к нему позже. – Cass

0

Ну, вопрос был довольно очевиден :) Вот код, который работал, основываясь на комментарий сквонк в:

byte[] data = new byte[50];  
      try{ 
      bs.mark(60); 
      bs.read(data, 0, data.length); 
      String value = new String(data,"UTF-8"); 
      if(value.toLowerCase().contains("utf-8")) 
       return "UTF-8"; 
      else if(value.contains("1251")) 
       return "windows-1251"; 
      } catch (IOException e) { 
       Log.d("debug", "Exception: " + e); 
       return "XML not found"; 
      } 

Затем просто перезагрузите bs (BufferedInputStream) и работайте с ним в любой необходимой кодировке.

Смежные вопросы