2016-07-23 1 views
0

Ich arbeite an Android App für RSS-Reader. Ich habe ein Problem, wenn ich Daten von verschiedenen URLs lese, da es mehrere verschiedene Zeichenkodierungen gibt, die in den RSS-Feeds verwendet werden, z. UTF-8 und ISO-8859-1.Wie mache ich die Codierung in UTF-8 für verschiedene Zeichen in Android

Ich bin mit Volley StringRequest Inhalte von RSS zu lesen und ich bin immer folgende Fehler für einige RSS-Feeds ..

BasicNetwork.performRequest: unerwartete Antwortcode 404 für http://khabar.ibnlive.com/rss/khabar/ghar-parivar/health.xml

Dies ist der Code, den ich für UTF-8 beim Parsen verwende.

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
if (currentapiVersion >= Build.VERSION_CODES.KITKAT) { 
    InputStream stream = new ByteArrayInputStream(response.getBytes(StandardCharsets.UTF_8)); 
    xpp.setInput(stream, null); 
} 
else{ 
    InputStream stream = new ByteArrayInputStream(response.getBytes(Charset.forName("UTF-8"))); 
    xpp.setInput(stream, null); 
} 

der Code arbeitet mit UTF-8-Zeichensatz URLs wie http://www.oneindia.com/rss/feature-fb.xml in Ordnung, aber über Fehler mit ISO-8859_1 unterstützt Urls zeigt.

Ich muss Daten aus mehreren RSS-Feeds lesen, also kann mir bitte jemand helfen, diese Zeichensatz zu erkennen und wie kann ich diese in UTF-8-Zeichensatz konvertieren oder Sie können eine bessere Option für diese Aufgabe vorschlagen.

+0

Lernen Sie Englisch, wenn Sie Bearbeitungen ablehnen: P –

Antwort

1

Einmal hatte ich gleiche Problem, während das Lesen von RSS in meinem Android-Anwendung-Feeds. Sie sollten diese URL in Postman hinzufügen überprüfen, ob es richtigen Inhalt zurückgibt oder nicht. Irgendwann sucht Server nach Benutzeragenten im Header und gibt dann die Antwort entsprechend zurück.

Wie Sie erwähnen Sie verwenden Volley Netzwerkanfrage zu machen, sollten Sie getHeaders() -Methode wie diese

@Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String, String> params = new HashMap<String, String>(); 

       params.put("data-type", "application/text"); 
      params.put("User-agent", "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0"); 

       return params; 
     } 

außer Kraft setzen und außer Kraft setzen auch parseNetworkResponse Methode roh Antwort auf UTF-8-String zu analysieren.

@Override 
protected Response<String> parseNetworkResponse(NetworkResponse response) { 

    try { 
     String utf8String = new String(response.data, "UTF-8"); 
     return Response.success(utf8String, HttpHeaderParser.parseCacheHeaders(response)) ; 
    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } 
} 

Ich hoffe, dass dies funktioniert, wie es für mich arbeitet.

+0

Sie schreiben params.put ("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv: 31.0) Gecko/20100101 Firefox/31.0"); Warum sollte ich das benutzen? –

+0

Um Benutzer-Agent als Mozilla zu imitieren, weil irgendwann Server Ihnen unterschiedliche Ergebnisse basierend auf Benutzer-Agent geben kann, Wenn Sie diese URL öffnen http://www.amarujala.com/rss/uttarakhand-news.xml mit Browser gibt es XML-Inhalt und wenn Sie es im Postboten öffnen, geben Sie html-Inhalt statt xml-Daten. –

+0

Also müsste ich User-Agent für jeden Browser schreiben? Oder wird es für Chrome, Safari, IE und Edge funktionieren? Wie kann ich das finden? –

Verwandte Themen