Tengo problemas de codificación de caracteres extraños con una matriz JSON que se toma de una página web. El servidor está devolviendo este encabezado:Android Java UTF-8 HttpClient Problema
Content-Type text/javascript; charset = UTF-8
También puedo ver la salida JSON en Firefox o cualquier navegador y los caracteres Unicode se muestran correctamente. La respuesta a veces contendrá palabras de otro idioma con símbolos de acento y demás. Sin embargo, obtengo esos signos de interrogación raros cuando lo abro y lo pongo en una cadena en Java. Aquí está mi código:
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "utf-8");
params.setBooleanParameter("http.protocol.expect-continue", false);
HttpClient httpclient = new DefaultHttpClient(params);
HttpGet httpget = new HttpGet("http://www.example.com/json_array.php");
HttpResponse response;
try {
response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode() == 200){
// Connection was established. Get the content.
HttpEntity entity = response.getEntity();
// If the response does not enclose an entity, there is no need
// to worry about connection release
if (entity != null) {
// A Simple JSON Response Read
InputStream instream = entity.getContent();
String jsonText = convertStreamToString(instream);
Toast.makeText(getApplicationContext(), "Response: "+jsonText, Toast.LENGTH_LONG).show();
}
}
} catch (MalformedURLException e) {
Toast.makeText(getApplicationContext(), "ERROR: Malformed URL - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "ERROR: IO Exception - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "ERROR: JSON - "+e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
private static String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the BufferedReader.readLine()
* method. We iterate until the BufferedReader return null which means
* there's no more data to read. Each line will appended to a StringBuilder
* and returned as String.
*/
BufferedReader reader;
try {
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
StringBuilder sb = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
Como se puede ver, yo estoy especificando UTF-8 en el InputStreamReader pero cada vez que veo el texto JSON devuelto a través de la tostada que tiene signos de interrogación extraños. Estoy pensando que necesito enviar el InputStream a un byte [] en su lugar?
Gracias de antemano por cualquier ayuda.
Gracias por la respuesta. Agregué los cambios e importé el material adicional de Apache para EntityUtils, pero ahora la aplicación solo termina inesperadamente en la línea EntityUtils.toString. programa se compila y se ejecuta, pero ¿tengo que hacer algo con la entidad antes de llamar a String? –
no importa. Yo era un idiota y arruiné algo con mi url. ¡Funciona! ¡Los personajes se representan correctamente! –
@Michael: Esta respuesta es muy buena y aceptaría esta si hubiera hecho la pregunta. – SK9