PDA

Ver la Versión Completa : [ SOLUCIONADO ] utf8


Merche300
27/02/16, 20:58:17
Pues eso, la ñ esta desaparecida, y en el php si se ve, ¿Alguna solucion con la clase ? Por que en el json se ve perfectamente, en minuscula eso si pero no se ven los caracteres raros. Gracias

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.herprogramacion.restaurantericoparico.R;
import com.herprogramacion.restaurantericoparico.Ranking_ Amonestaciones_Cadetes;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;


public class Ranking_Amonestaciones_Adapter_Juveniles extends ArrayAdapter {

// Atributos
private RequestQueue requestQueue;
JsonObjectRequest jsArrayRequest;
private static final String URL_BASE = "http://cadetes.esy.es/2015/amonestados_juvenil.php";
private static final String URL_JSON = "";
private static final String TAG = "";
List<Ranking_Amonestaciones_Cadetes> items;

public Ranking_Amonestaciones_Adapter_Juveniles(Context context) {
super(context,0);

// Crear nueva cola de peticiones
requestQueue= Volley.newRequestQueue(context);

// Nueva peticion JSONObject
jsArrayRequest = new JsonObjectRequest(
Request.Method.GET,
URL_BASE + URL_JSON,
null,
new Response.Listener<JSONObject>() {
override
public void onResponse(JSONObject response) {
items = parseJson(response);
notifyDataSetChanged();
}
},
new Response.ErrorListener() {
override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "Error Respuesta en JSON: " + error.getMessage());

}
}
);

// Anyadir peticion a la cola
requestQueue.add(jsArrayRequest);
}

override
public int getCount() {
return items != null ? items.size() : 0;
}

override
public View getView(int position, View convertView, ViewGroup parent) {

LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());

// Referencia del view procesado
View listItemView;

//Comprobando si el View no existe
listItemView = null == convertView ? layoutInflater.inflate(
R.layout.ranking_amonestaciones_cadetes_row,
parent,
false) : convertView;


// Obtener el item actual
Ranking_Amonestaciones_Cadetes item = items.get(position);

// Obtener Views
TextView textoNombre = (TextView) listItemView.findViewById(R.id.tv_nombre_local);
TextView textoTargetas = (TextView) listItemView.findViewById(R.id.tv_goles);
TextView textoAmarillas = (TextView) listItemView.findViewById(R.id.tv_dobles);
TextView textoDobles = (TextView) listItemView.findViewById(R.id.tv_amarillas);
TextView textoRojas = (TextView) listItemView.findViewById(R.id.tv_rojas);
TextView textoEquipo = (TextView) listItemView.findViewById(R.id.tv_equipo);


// Actualizar los Views
textoNombre.setText(item.getNombre());
textoTargetas.setText(item.getTargetas());
textoAmarillas.setText(item.getAmarillas());
textoDobles.setText(item.getDobles());
textoRojas.setText(item.getRojas());
textoEquipo.setText(item.getEquipo());





// Anyadir peticion a la cola



return listItemView;
}

public List<Ranking_Amonestaciones_Cadetes> parseJson(JSONObject jsonObject){
// Variables locales
List<Ranking_Amonestaciones_Cadetes> rankingAmonestacionesCadetes = new ArrayList<>();
JSONArray jsonArray= null;

try {
// Obtener el array del objeto
jsonArray = jsonObject.getJSONArray("maxAmonestados");

for(int i=0; i<jsonArray.length(); i++){

try {
JSONObject objeto= jsonArray.getJSONObject(i);

Ranking_Amonestaciones_Cadetes RankingAmonestacionesCadetes = new Ranking_Amonestaciones_Cadetes(
objeto.getString("nombre"),
objeto.getString("totalTarjetas"),
objeto.getString("amarillas"),
objeto.getString("dobles"),
objeto.getString("rojas"),
objeto.getString("equipo"));


rankingAmonestacionesCadetes.add(RankingAmonestaci onesCadetes);

} catch (JSONException e) {
Log.e(TAG, "Error de parsing: " + e.getMessage());
}
}

} catch (JSONException e) {
e.printStackTrace();
}


return rankingAmonestacionesCadetes;
}
}

mocelet
27/02/16, 23:07:56
El servidor ese devuelve las codificaciones que le da la gana y no es consistente.

La ñ minúscula no es una ñ aunque lo veas así en el navegador, si miras el código fuente de la página es RAFELBU& #241;OL C.F. (te pongo un espacio extra para que no salga la ñ) Es decir, ahí los caracteres especiales están codificados como si fuera ASCII con códigos numéricos (como los que usan al codificar las URL). El navegador lo entiende y lo cambia por la ñ, pero para Java es texto normal salvo que lo decodifiques.

Sin embargo en otros campos pone MAñES PADIAL, ahí claramente es un problema de no especificar la codificación. Es de suponer que es UTF-8 y se está interpretando como ISO Latin 1 que es el encoding por defecto en HTML y el que usa Volley si no tiene información en las cabeceras de la respuesta HTTP.

Lo ideal sería que el servidor estuviera bien hecho, pero como no va a ocurrir lo mejor es que arregles los desperfectos a mano (sustituyendo los caracteres raros por los correctos y arreglando las minúsculas/mayúsculas), tampoco hay tantos caracteres especiales y seguro que acabas antes tratando cada uno individualmente.

Merche300
28/02/16, 00:00:26
El servidor ese devuelve las codificaciones que le da la gana y no es consistente.

La ñ minúscula no es una ñ aunque lo veas así en el navegador, si miras el código fuente de la página es RAFELBU& #241;OL C.F. (te pongo un espacio extra para que no salga la ñ) Es decir, ahí los caracteres especiales están codificados como si fuera ASCII con códigos numéricos (como los que usan al codificar las URL). El navegador lo entiende y lo cambia por la ñ, pero para Java es texto normal salvo que lo decodifiques.

Sin embargo en otros campos pone MAñES PADIAL, ahí claramente es un problema de no especificar la codificación. Es de suponer que es UTF-8 y se está interpretando como ISO Latin 1 que es el encoding por defecto en HTML y el que usa Volley si no tiene información en las cabeceras de la respuesta HTTP.

Lo ideal sería que el servidor estuviera bien hecho, pero como no va a ocurrir lo mejor es que arregles los desperfectos a mano (sustituyendo los caracteres raros por los correctos y arreglando las minúsculas/mayúsculas), tampoco hay tantos caracteres especiales y seguro que acabas antes tratando cada uno individualmente.

Muchas gracias,no tienes idea de lo que me has ayudado.


$data3 = str_replace(array("ñ"),"NY",$data2);

Bueno cambiar la ñ por los caracteres que pones arriba

Supuestamente la ñ viene a ser ny en valenciano, supongo que catalán también, y cambiando los caracteres es lo que e conseguido para que se vea RAFELBUNYOL.

kriogeN
28/02/16, 02:08:44
Muchas gracias,no tienes idea de lo que me has ayudado.


$data3 = str_replace(array("ñ"),"NY",$data2);

Bueno cambiar la ñ por los caracteres que pones arriba

Supuestamente la ñ viene a ser ny en valenciano, supongo que catalán también, y cambiando los caracteres es lo que e conseguido para que se vea RAFELBUNYOL.

Existen infinidad de librerías de codificación y decodificación HTML en Java, que los &nbsp te los cambia por espacios, los &lt; por < etc. Supongo que alguna habrá que lo haga también con la ñ.

mocelet
28/02/16, 08:15:47
¿Pero entonces el servidor lo controlas tú? El código que has puesto antes es PHP no Java. Para arreglar los otros caracteres o bien indicas que el content type tiene el charset utf8 o bien haces la conversión en el PHP a ISO latin antes de mandarlo.

Merche300
28/02/16, 08:16:34
Existen infinidad de librerías de codificación y decodificación HTML en Java, que los &nbsp te los cambia por espacios, los &lt; por < etc. Supongo que alguna habrá que lo haga también con la ñ.

kriogeN si, &Ntilde mayusculas y &ntilde para minusculas,pero vuelve a reconocer la ñ y sale un rombo negro con un interrogante blanco en el fondo, no se porque pero asi es, al menos en mi caso

Merche300
28/02/16, 08:19:18
¿Pero entonces el servidor lo controlas tú? El código que has puesto antes es PHP no Java. Para arreglar los otros caracteres o bien indicas que el content type tiene el charset utf8 o bien haces la conversión en el PHP a ISO latin antes de mandarlo.

En este caso lo controlo yo

mocelet
28/02/16, 08:31:26
Dado que sólo genera un JSON lo suyo es que las cabeceras estén bien generadas en el PHP:

header('Content-Type: application/json; charset=utf-8');

O text/plain si te diera algún problema

P.D. También puede ser que el problema de codificación venga de otro sitio, por ejemplo al leer de la base de datos. En algún sitio se asume que es una codificación siendo otra, mientras antes se arregle en la cadena de transformaciones mejor.

c2alvaro
29/02/16, 14:15:19
Yo uso esto en mi WebService con PHP y me funciona MUY BIEN mostrando sin problemas las ñ en android.

Yo devuelvo un array en json desde PHP

Cuando necesito llenar el array campo por campo, el campo NOM1 es nombre completo y logico que vendra una ñ por ahi:
$datos1["NOM1"]=utf8_encode($row["NOM1"]);

Y tambien cuando paso todo el array devuelto en la consulta sin necesidad de tratamientos especiales:

$datos[]=array_map('utf8_encode', $row);

Saludos.