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?
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));
}
}
}
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;
}
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;
}
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");
}
}
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
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.
schreiben Sie diese Abfrage, bevor Sie sie in Ihrer Datenbank ausführen
mysqli_query ($ this-> connection, "set_NAMES_utf8");
verwenden Sie diesen Header in Ihrer Datei, wenn es PHP ist
header ('Inhaltstyp: application/json; Zeichensatz = utf-8');
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".