acentos - Conjunto de caracteres predeterminado de Android al enviar una publicación/colocación http: problemas con caracteres especiales
java acentos utf-8 (4)
Aparentemente, me olvidé de establecer el conjunto de caracteres de StringEntity en UTF-8. Estas líneas hicieron el truco:
httpPut.setEntity(new StringEntity(body, HTTP.UTF_8));
httpPost.setEntity(new StringEntity(body, HTTP.UTF_8));
Por lo tanto, hay al menos dos niveles para configurar el conjunto de caracteres en el cliente de Android al enviar una publicación http con caracteres que no sean ASCII.
- El resto del propio cliente.
- La entidad de cadena
ACTUALIZACIÓN: Como Samuel señaló en los comentarios, la forma moderna de hacerlo es usar un ContentType, de esta manera:
final StringEntity se = new StringEntity(body, ContentType.APPLICATION_JSON);
httpPut.setEntity(se);
He configurado el httpClient de apache así:
HttpProtocolParams.setContentCharset(httpParameters, "UTF-8");
HttpProtocolParams.setHttpElementCharset(httpParameters, "UTF-8");
También incluyo el encabezado http "Content-Type: application / json; charset = UTF-8" para todas las solicitudes de envío y colocación de http.
Estoy intentando enviar solicitudes de publicación / colocación http con un cuerpo json que contiene caracteres especiales (es decir, caracteres chinos a través del teclado, símbolos, etc. de Google Pinyin). Los caracteres aparecen como incoherentes en los registros, pero creo que esto se debe a que DDMS sí no es compatible con UTF-8, como se describe en this número.
El problema es cuando el servidor recibe la solicitud, a veces no ve los caracteres (especialmente los caracteres chinos), o se convierte en basura sin sentido cuando la recuperamos a través de una solicitud GET.
También intenté colocar 250 caracteres no-ascii en un solo campo porque ese campo en particular debería tener capacidad para 250 caracteres. Sin embargo, no se puede validar en el lado del servidor que afirma que se ha excedido el límite de 250 caracteres. 250 caracteres ASCII funcionan bien.
Los tipos del servidor afirman que soportan UTF-8. Incluso intentaron simular una solicitud de publicación que contiene caracteres chinos, y los datos fueron recibidos por el servidor muy bien. Sin embargo, el chico (un chino) está usando una computadora con Windows con el paquete de idioma chino instalado (creo, porque puede escribir caracteres chinos en su teclado).
Supongo que los conjuntos de caracteres utilizados por el cliente de Android y el servidor (hecho por chinos por cierto) no están alineados. Pero no sé cuál es el culpable, ya que los tipos del servidor afirman que admiten UTF-8, y nuestro cliente restante está configurado para admitir UTF-8.
Esto me hizo preguntarme qué sistema de caracteres usa Android de forma predeterminada en todas las entradas de texto, y si se puede cambiar a otro programáticamente. Intenté encontrar recursos sobre cómo hacer esto en los widgets de entrada, pero no encontré nada útil.
¿Hay alguna forma de configurar el conjunto de caracteres para todos los widgets de entrada en Android? ¿O tal vez me perdí algo en la configuración del resto del cliente? ¿O tal vez, solo tal vez, los tipos de servidores no están usando UTF-8 en sus servidores y en su lugar usan juegos de caracteres de Windows?
Debería establecer el conjunto de caracteres de su entidad de cadena en UTF-8:
StringEntity stringEntity = new StringEntity(urlParameters, HTTP.UTF_8);
Puede eliminar el servidor como el problema usando curl
para enviar los mismos datos. Si funciona con el curl
use --trace
para verificar la salida.
Asegúrese de que está enviando el cuerpo del contenido como bytes. Compare la solicitud HTTP de Android con la salida de la solicitud de curl
exitosa.
Sé que este post es un poco viejo pero sin embargo aquí hay una solución:
Aquí está mi código para publicar cadenas UTF-8 (no importa si son xml soap o json) en un servidor. Lo probé con valores cirílicos, hash y algunos otros caracteres especiales y funciona como un encanto. Es una compilación de muchas soluciones que encontré a través de los foros.
HttpParams httpParameters = new BasicHttpParams();
HttpProtocolParams.setContentCharset(httpParameters, HTTP.UTF_8);
HttpProtocolParams.setHttpElementCharset(httpParameters, HTTP.UTF_8);
HttpClient client = new DefaultHttpClient(httpParameters);
client.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
client.getParams().setParameter("http.socket.timeout", new Integer(2000));
client.getParams().setParameter("http.protocol.content-charset", HTTP.UTF_8);
httpParameters.setBooleanParameter("http.protocol.expect-continue", false);
HttpPost request = new HttpPost("http://www.server.com/some_script.php?sid=" + String.valueOf(Math.random()));
request.getParams().setParameter("http.socket.timeout", new Integer(5000));
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
// you get this later in php with $_POST[''value_name'']
postParameters.add(new BasicNameValuePair("value_name", "value_val"));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters, HTTP.UTF_8);
request.setEntity(formEntity);
HttpResponse response = client.execute(request);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
String lineSeparator = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line);
sb.append(lineSeparator);
}
in.close();
String result = sb.toString();
Espero que alguien encuentre útil este código. :)