1
    private class DescargarNoticias extends AsyncTask<Void, Void, Void> {
        public void onPreExecute() {

        }
        public void onPostExecute(Void unused) {
        }

        @Override
        protected Void doInBackground(Void... params) {
            StringRequest request = new StringRequest(Request.Method.POST, getString(R.string.municipio_noticias), new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    if (!response.equals("null")){
                        try {
                            basededatos.EliminarNoticias();
                            JSONArray jsonArray = new JSONArray(response);
                            for (int i = 0; i < jsonArray.length(); i++) {
                                basededatos.RegistrarNoticias(
                                        jsonArray.getJSONObject(i).getInt("folio"),
                                        jsonArray.getJSONObject(i).getString("encabezado"),
                                        jsonArray.getJSONObject(i).getString("fecha"),
                                        jsonArray.getJSONObject(i).getString("texto"),
                                        jsonArray.getJSONObject(i).getString("autor"));

                                Log.d("ENCABEZADO",jsonArray.getJSONObject(i).getString("encabezado"));
                               //D/ENCABEZADO: Entrega de un apoyo económi... <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                            }
                            ConsultarNoticias();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            }) {
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    Map<String, String> parameters = new HashMap<String, String>();
                    return parameters;
                }
            };
            requestQueue.add(request);
            return null;
        }
    }

Dato que me arroja:

//D/ENCABEZADO: Entrega de un apoyo económi...

PHP FILE

    <?php
if($_SERVER["REQUEST_METHOD"]=="POST"){
    include('conexion.php');
    $result  = mysqli_query($con,"SELECT * FROM noticias") or mysqli_error($con);
    while ($row = $result->fetch_assoc()) {
         $arr[] = $row;
    }
    $json = json_encode($arr,JSON_UNESCAPED_UNICODE);
    echo $json;
}
?>

¿Como puedo hacer que acepte los acentos?

DoubleM
  • 1,401
  • 3
  • 22
  • 56
  • Si has programado tú el servicio que estás consultando para que te dé los datos, lo mejor sería que adaptes dicho servicio para que te mande los datos bien codificados. Por ejemplo, si es un servicio que consulta datos en una base de datos: cuando creas la conexión a la base de datos, decirle que establezca el juego de caracteres a utf-8, y cuando creas el json, decirle que te lo mande en utf-8. No te puedo decir más, ya que no especificas eso. Otra opción sería convertir la respuesta a utf-8: **`if (!response.equals("null")){response=new String(response, "UTF-8"); try {...`** – A. Cedano Jan 11 '18 at 08:59
  • pero como codificaría eso, en el archivo php que envía los datos. – DoubleM Jan 12 '18 at 02:21
  • Manuel eso dependerá de algunas cosas. Primeramente, antes de imprimir en JSON en PHP, tú puedes indicar un `header` como este: **`header('Content-Type: application/json; charset=utf8');`** y a continuación imprimes el JSON: `print_r($json_que_recibira_android)`; Si aún así te sigue enviando caracteres extraños tendrás que ir a la fuente de datos. Si es una base de datos, primero tendrás que revisar si al crear la conexión le estás asignado el juego de caracteres `utf-8`. Si todo está ok ahí, entonces tendrás que ir a los datos y verificar si las tablas/columnas no tienen un charset... – A. Cedano Jan 12 '18 at 12:13
  • ... extraño. Y si ahí todo está ok, tendrás que revisar si los datos en sí no fueron introducidos así, con caracteres extraños. Si es así, no te queda otra que corregir los datos y revisar la codificación que tenían los datos antes de introducirlos a la base de datos (por ejemplo, si fueron tomados de un archivo de texto, revisar la codificación de ese archivo y corregirla). De ese modo, podrás tomar los datos de nuevo de su fuente original, pero corregidos y actualizarlos en la BD. Yo he tratado todo eso con más detalle [en esta respuesta](https://es.stackoverflow.com/a/59510/29967). – A. Cedano Jan 12 '18 at 12:16
  • he modificado mi pregunta. En la bdd se almacena correctamente con acento así como tambien en la impresion del JSON del archivo _php_ el problema es al recibirlos en android. – DoubleM Jan 12 '18 at 19:39
  • 1
    Manuel yo haría estas tres cosas: 1. Verificar que al crear la conexión establezco el charset a utf-8; 2. Poner el header como te indico más arriba, antes de imprimir el JSON; 3. Crear e Imprimir el JSON sin más, sin ningún otro parámetro en el `json_encode`. Yo así lo uso en una App Android y me funciona perfectamente. – A. Cedano Jan 13 '18 at 18:24
  • exelente A. Cedano, no creí que la solucion era un simple _Content-Type_ en el archivo php. Muchas gracias! – DoubleM Jan 13 '18 at 18:58
  • De nada Manuel. Me alegro de que te haya funcionado. Saludos. – A. Cedano Jan 13 '18 at 19:11

1 Answers1

1

Ya que en comentarios dices que los datos están bien en la base de datos, yo verificaría tres cosas:

  1. Que al crear la conexión establezco el charset a utf-8;

  2. Antes de imprimir el JSON poner el header:

    header('Content-Type: application/json; charset=utf8');
    
  3. Crear e Imprimir el JSON sin más, sin ningún otro parámetro en el json_encode:

    $json = json_encode($arr); 
    echo $json; 
    

Yo así lo uso en una App Android y me funciona perfectamente.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221