Определить кодировку RSS-канала в Android - PullRequest
2 голосов
/ 29 марта 2012

Я пытаюсь проанализировать XML с помощью XmlPullParser.

Хочу получить Кодировку корма

Например

    <?xml version="1.0" encoding="ISO-8859-1"?>

и

   <?xml version="1.0" encoding="UTF-8"?>

Здесь две разные кодировки, я хочу определить кодировку,

Может кто-нибудь Я пытался getInputEncoding().

Ответы [ 3 ]

4 голосов
/ 02 ноября 2012
//URL_FEED Example: http://jovemnerd.ig.com.br/feed/rss/
final HttpGet httpget = new HttpGet(URL_FEED);

//Connect 
final HttpResponse response = httpclient.execute(httpget);

//Get Entity connection
HttpEntity entity = response.getEntity();

//Get InputStream
InputStream feed = entity.getContent();

...

//Convert InputStrean to InputSource
final InputSource source = new InputSource(feed);

//If encondind is not detect , then read head xml and set enconding   
if(source.getEncoding()==null){ //THIS THE PROBLEM
    //The enconding is null, but in entity have head with type enconding
    source.setEncoding(getEncondingFromEntity(entity));
}

/*Now your InputSource have the correct enconding, then use "source" in your parse. Ex:*/
final XMLReader xmlreader = parser.getXMLReader();
final RSSHandler handler = new RSSHandler(config);
xmlreader.setContentHandler(handler);
xmlreader.parse(source);

...

private String getEncondingFromEntity(HttpEntity entity){
  if(entity.getContentType()!=null){
    //Content-Type: text/xml; charset=ISO-8859-1
    //Content-Type: text/xml; charset=UTF-8
      for(String str : entity.getContentType().getValue().split(";")){
          if(str.toLowerCase().contains("charset")){
              return str.toLowerCase().replace("charset=","").replace(";","").replace(" ","");
          }
      }
  }
  return null;
}
0 голосов
/ 17 февраля 2013
//Open Connection with URL XML Content
        URL url;
        InputStream feedStream = null;
        HttpURLConnection urlConnection = null;
//This URL have enconding ISO-8859-1
        url = new URL("http://feeds.feedburner.com/99vidaspodcast");
        urlConnection = (HttpURLConnection) url.openConnection();
        feedStream = new BufferedInputStream(urlConnection.getInputStream());

//Read and Parse XML with correct Enconding

        RSSFeed feed= parser.parse(feedStream,getEncondingFromEntity(urlConnection.getContentType()));

----------------------
//Detect Enconding

        private String getEncondingFromEntity(String contentType){
          if(contentType!=null){
           for(String str : contentType.split(";")){
            if(str.toLowerCase().contains("charset")){
              return str.toLowerCase().replace("charset=","").replace(";","").replace(" ","");
            }
           }
          }
          return null;
        }

------------------------
//Apply Enconding and Parse XML    
    private RSSFeed parse(SAXParser parser, InputStream feed, String enconding)
          throws SAXException, IOException {
        if (parser == null) {
          throw new IllegalArgumentException("RSS parser must not be null.");
        } else if (feed == null) {
          throw new IllegalArgumentException("RSS feed must not be null.");
        }

        final InputSource source = new InputSource(feed);
        if(source.getEncoding()==null && enconding!=null){
            //Magic :]
            source.setEncoding(enconding);
        }
        final XMLReader xmlreader = parser.getXMLReader();
        final RSSHandler handler = new RSSHandler(config);

        xmlreader.setContentHandler(handler);
        xmlreader.parse(source);

        return handler.feed();
      }

    -------------------------
0 голосов
/ 02 октября 2012

Вы могли бы что-то вроде этого: XmlPullparser parser = new XmlPullParser (inputtream in, null);это автоматически определит кодировку

...