android - jsonobjectrequest - Codificación UTF-8 en solicitudes de Volley
android volley post json (7)
Esto funcionó como un encanto para mí. Acabo de crear un método estático de la respuesta de @Muhammad Naeem. Gracias 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;
}
En mi aplicación de Android estoy cargando datos json con un Volley JsonArrayRequest
. Los datos fueron creados por mí mismo y los guardé con Sublime con codificación UTF-8. Cuando recibo la Response
y llevo mi ListView
, los textos no se muestran correctamente (diéresis). Así es como se ve mi solicitud:
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);
Cuando cargo exactamente los mismos datos con este método, todos los textos se muestran correctamente:
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();
}
Entonces, para mí, parece que no hay ningún problema con la codificación de mi archivo json. ¿Cómo puedo solucionar este problema de codificación en Volley?
No use try {} catch en el bloque onResponse, eso está dando algún problema en mi código, en lugar de que pueda implementar de esta manera.
@Override
onResponse(String s) {
s= fixEncoding(s);
Toast.makeToast(this,s,Toast.LENGTH_LONG).show();
}
y creo que obtendrás el resultado requerido
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;
}
Para especificar en la parte del servidor, establezca utf-8 en el tipo de contenido como "text / html; charset = utf-8"
Si sabe que absolutamente todos los archivos que está solicitando estarán en el formato UTF-8, lo que parece que es, entonces puede considerar forzar su solicitud de Volley para devolver cadenas con formato UTF-8. Puede lograr esto subclasificando la solicitud JSON estándar. Algo como esto:
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));
}
}
}
Tengo el mismo problema así y lo resuelvo usando el juego de caracteres UTF-8.
String str = "";
try {
str = new String(strFromService.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String decodedStr = Html.fromHtml(str).toString();
Espero que esto funcione para tí
Tuve el mismo problema hace dos días y he intentado todo lo que mis amigos acaban de decir y es el mismo problema y he intentado cosas tan malas ... mi archivo está escrito en php y usa voley para obtener los datos como json i siguió estos pasos para resolver el problema ...
antes de ejecutar la consulta en su base de datos, escriba esta consulta
mysqli_query ($ this-> connection, "set_NAMES_utf8");
utiliza este encabezado en tu archivo si es php
encabezado (''Content-Type: application / json; charset = utf-8'');
Mientras haces eco del json de acuerdo con php hay una solución para este problema usa este charachter especial en
json_encode($json,JSON_UNESCAPED_UNICODE)
espero que haya ayudado
otro enfoque: puede codificar toda su respuesta por esta línea de código.
newStr = URLDecoder.decode(URLEncoder.encode(oldStr, "iso8859-1"),"UTF-8");
He codificado cadena de respuesta completa en UTF-8, ya que sé que el método de codificación por defecto de volley es iso8859-1