2012-01-04 16 views
6

Mi aplicación para Android se comunica a través de HTTP Post con un servidor PHP. que se suman a la petición HTTP siguiente parámetro:HTTP Post convierte € a? símbolo

nameValuePairs.add(new BasicNameValuePair("text", message)); 

mensaje es una cadena y contiene el símbolo €

En el servidor se está ejecutando PHP y recibe la petición. Desafortunadamente el símbolo € se convierte automáticamente a? símbolo. Todos los otros símbolos funcionan como "A, U, $, ß

En Android he puesto ninguna codificación:

HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://server.com/test.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 

En el sitio PHP también tengo nada especificado Aquí el código:.

<?php 

mysql_connect("blablaost.com", "blabla", "blabla") or die(mysql_error()); 
mysql_select_db("asfd") or die(mysql_error()); 
$mysqldate = gmdate('Y-m-d H:i:s'); 

$language = (int) $_REQUEST['language']; 

mysql_query("blabla ... .$_REQUEST['text']. ") 
or die(mysql_error()); 

mysql_close(); 

?> 

$ _REQUEST [ 'texto'] contiene el € y me da una?

+0

¿Puedes verificar la codificación que envían/​​esperan los dos lados? –

+0

¿Alguna suerte jugando con urldecode() y rawurldecode() en el lado php? ¿Cómo está controlando el resultado? –

+0

parece que la codificación de salida/entrada del servidor PHP es ISO-8859-1. Lo compruebo escribiéndolo en mySQL DB. ¡Pero esto no es culpa! No estoy seguro de qué hacer con urldecode() .. – tobias

Respuesta

2

el segundo parámetro construcción de UrlEncodedFormEntity es el t transmita la codificación. Reemplazar con:

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); 

Además, asegúrese de que la página Web que muestra el valor de un conjunto de caracteres informa al navegador y se ajuste a ese juego de caracteres. Para informar sobre el conjunto de caracteres para el navegador, utilice uno

header("Content-Type: text/html;charset=UTF-8", true); 

en PHP, o

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> 

elemento HTML de bajo <head>. El primero prevalece sobre este último, si se proporcionan ambos.

La codificación real que tiene el archivo PHP (es decir, la codificación de los caracteres que no son ASCII) tiene que coincidir con las reclamaciones de un archivo PHP como su tipo de contenido. Dependiendo de su editor de PHP, puede haber diferentes formas de establecer la codificación del archivo. En Visual Studio, por ejemplo, hay un comando "Guardar con codificación".

EDITAR re: tema relacionado:

Para eliminar PHP comillas mágicas, utilizo la siguiente función:

function deq($s) //Stands for "dequote" 
{ 
    if($s == null) 
     return null; 
    return 
     get_magic_quotes_gpc() ? 
     stripslashes($s) : $s; 
} 

Y entonces, en lugar de $ _POST [ "xxx"], utilizo DEQ ($ _POST ["xxx"]) cuando corresponda. Como la configuración del servidor puede cambiar (y el servidor puede cambiar si migra), la función de compensación debe tener en cuenta el valor actual de la configuración.

+0

bien ahora obtengo para € symbol algo así como -â .. Creo que tengo que establecer la codificación también en el archivo php? – tobias

+0

La codificación que tiene el archivo PHP (es decir, la codificación de los caracteres que no son ASCII en ella) tiene que coincidir con las reclamaciones de un archivo PHP como Content-Type. Dependiendo de su editor de PHP, puede haber diferentes formas; en Visual Studio, por ejemplo, hay un comando "Guardar con codificación". –

+0

He puesto la codificación del archivo php en utf-8 lf, pero todavía tengo problemas con esta línea: if (md5 (utf8_encode ($ _ REQUEST ['text']. "Test")) == $ _REQUEST ['hash ']) si el texto contiene un €, estoy evaluado como falso – tobias