web-dev-qa-db-de.com

UTF-8-Codierung in Volley-Anfragen

In meiner Android-App lade ich JSON-Daten mit einer Volley JsonArrayRequest. Die Daten wurden von mir selbst erstellt und mit Sublime mit UTF-8-Codierung gespeichert. Wenn ich die Response erhalte und meine ListView fülle, werden die Texte nicht richtig angezeigt (Umlaute). So sieht meine Anfrage aus:

JsonArrayRequest request = new JsonArrayRequest(targetUrl,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(final JSONArray response) {
                        try {
                            fillList(response);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        requestQueue.add(request);

Wenn ich mit dieser Methode exakt dieselben Daten lade, werden alle Texte korrekt angezeigt:

final StringBuilder builder = new StringBuilder();
        final HttpClient client = new DefaultHttpClient();
        final HttpGet httpGet = new HttpGet(request);
        try {
            final HttpResponse response = client.execute(httpGet);
            final StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                final HttpEntity entity = response.getEntity();
                final InputStream content = entity.getContent();
                final BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
            } else {

            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

Für mich scheint es also kein Problem mit der Kodierung meiner JSON-Datei zu geben. Wie kann ich dieses Codierungsproblem in Volley beheben?

9
JensJensen

Wenn Sie wissen, dass absolut alle Dateien, die Sie anfordern, im UTF-8-Format vorliegen, wie es sich anhört, können Sie Ihre Volley-Anfrage zwingen, UTF-8-formatierte Zeichenfolgen zurückzugeben. Sie können dies erreichen, indem Sie die Standard-JSON-Anforderung in Unterklassen unterteilen. Etwas wie das:

public class Utf8JsonRequest extends JsonRequest<JSONObject> {
    ...
    @Override
    protected Response<JSONObject> parseNetworkResponse (NetworkResponse response) {
        try {
            String utf8String = new String(response.data, "UTF-8");
            return Response.success(new JSONObject(utf8String), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            // log error
            return Response.error(new ParseError(e));
        } catch (JSONException e) {
            // log error
            return Response.error(new ParseError(e));
        }
    }
}
23
Matthew Pape

Ich habe das gleiche Problem wie dieses und ich löse es mit UTF-8-Zeichensatz.

String str = "";
try {
     str = new String(strFromService.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {

 e.printStackTrace();
}

String decodedStr = Html.fromHtml(str).toString();

Ich hoffe das wird für dich funktionieren

verwenden Sie nicht try {} catch im onResponse-Block, da dies ein Problem in meinem Code darstellt, das Sie nicht so implementieren können.

@Override 
onResponse(String s) {

s= fixEncoding(s);
Toast.makeToast(this,s,Toast.LENGTH_LONG).show();

}

und ich denke, Sie werden das gewünschte Ergebnis erzielen

 public static String fixEncoding(String response) {
            try {
                byte[] u = response.toString().getBytes(
                        "ISO-8859-1");
                response = new String(u, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return null;
            }
            return response;
        }
6
erluxman

Das ist ein Zauber für mich. Ich habe gerade eine statische Methode aus der Antwort von @ Muhammad Naeem erstellt. Danke Muhammed.

public static String fixEncodingUnicode(String response) {
    String str = "";
    try {
        str = new String(response.getBytes("ISO-8859-1"), "UTF-8");
    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();
    }

    String decodedStr = Html.fromHtml(str).toString();
    return  decodedStr;
}
5

Fügen Sie diese Codezeile in die Antwort von volley ein:

 public void onResponse(String response) 
    {

     if (response != null) 
      {
        response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
      }
   }
4
Osama Ibrahim

ein weiterer Ansatz: Sie können Ihre gesamte Antwort mit dieser Codezeile codieren.

newStr = URLDecoder.decode(URLEncoder.encode(oldStr, "iso8859-1"),"UTF-8");

Ich habe die gesamte Antwortzeichenfolge in UTF-8 codiert, da ich weiß, dass die Standardcodierungsmethode für Volleyball iso8859-1 ist

2
Din Islam Milon

Ich hatte vor zwei Tagen das gleiche Problem und ich habe alles ausprobiert, was meine Freunde gerade gesagt haben, und es ist das gleiche Problem, und ich habe so gemeine Dinge ausprobiert. Meine Datei ist in PHP geschrieben und verwendet Volley, um die Daten als json i abzurufen Befolgen Sie diese Schritte, um das Problem zu lösen.

  1. schreiben Sie diese Abfrage, bevor Sie sie in Ihrer Datenbank ausführen

    mysqli_query ($ this-> connection, "set_NAMES_utf8");

  2. verwenden Sie diesen Header in Ihrer Datei, wenn es PHP ist

    header ('Inhaltstyp: application/json; Zeichensatz = utf-8');

  3. während du den json laut php wiedergibst gibt es eine lösung für dieses problem benutze diesen speziellen charachter in json_encode($json,JSON_UNESCAPED_UNICODE)

    ich hoffe, es hat geholfen

Zum Angeben im Serverteil setzen Sie utf-8 in den Inhaltstyp "text/html; charset = utf-8".