[php/MySQL/Java] Encodage de strings

pipo114 -  
 pipo114 -
Bonjour,

J'ai cherché partout, mais je n'arrive pas à trouver la solution à mon problème, qui je pense est un problème de compréhension.

Je travaille sur un système composé de deux applications :
- Un serveur php/MySQL
- Une application Android (donc Java)

Dans l'utilisation la plus simple, l'utilisateur saisie un texte multiligne avec accents dans un txtarea d'un formulaire php. Ce formulaire php enregistre le contenue dans la BDD MySQL. J'ai choisi l'encodage en UTF8 (qui accepte les accents de trop chère et ô combien sacrée langue française).

Pour cela j'utilise le code suivant :


		$txt = htmlentities($_POST['txt'],ENT_QUOTES,'UTF-8');
		$phoneNumber = htmlentities($_POST['phoneNumber'],ENT_QUOTES,'UTF-8');
		
		$rq = "INSERT INTO message (id_user, id_phone, dest_number, txt, dh, accuse) 
		VALUES (1, 1, '$phoneNumber', '$txt', NOW(), 0)";
		
		mysql_connect($BDDserver , $BDDuser,$BDDpwd );
		mysql_select_db($BDDname);
		mysql_set_charset('UTF8');

		mysql_query($rq);


Jusque là, tout vas bien, j'ai dans ma BDD les valeurs pour le champ message.txt du type "l'écharpe" (pour "l'écharpe").


D'un autre côté, j'ai mon application Android qui récupère ce champs grâce à cette page php en faisant un post :



mb_internal_encoding('UTF-8');
	
	$email = $_POST['email'];
	$pwd = $_POST['pwd'];
	
	include_once 'Util/BDDfunctions.php';
	include_once 'Controller/UserController.php';
	
	$rq = "SELECT\n".
		"message.id,\n".
		"message.dest_number,\n".
		"message.txt,\n".
		"message.dh\n".
		"FROM\n".
		"message\n".
		"INNER JOIN 'user' ON message.id_user = 'user'.id ".
		"WHERE\n".
		"'user'.email = '$email' AND\n".
		"'user'.pwd = MD5('$pwd') AND\n".
		"message.accuse = 0";
	
	$retour = executeBDD($rq);
	
	//ecodage en UTF8
	header ('Content-type:text/html; charset=utf-8');
	
	if($retour != null)
	{
		echo "<SMSs>";
		$num_rows = mysql_num_rows($retour);
		if ($num_rows != 0)
		{
			
			while($donnees = mysql_fetch_array($retour))
			{
				$id= $donnees['id'];
				$dest_num= $donnees['dest_number'];
				echo $donnees['txt'];
				$txt= utf8_decode($donnees['txt']);
				$dh = strtotime($donnees['dh']);
				echo "<SMS id=\"$id\"><dest value=\"$dest_num\"/><text value=\"$txt\"/><dh value=\"$dh\"/></SMS>";
			}
			
		}
		echo "</SMSs>";
	}


J'utilise alors le code Java suivant pour récupérer le contenu la page en question :


public static String postData(String url, ArrayList<NameValuePair> paramList) {
	    
	    HttpClient httpclient = new DefaultHttpClient();
	    
	    HttpPost httppost = new HttpPost(url);
	    
	    String HTMLCodeResponse = "";
	    	
	  
	        httppost.setEntity(new UrlEncodedFormEntity(paramList, HTTP.UTF_8));

	        HttpResponse response = httpclient.execute(httppost);
	   	        
	        
	        HttpEntity entity = response.getEntity();
	        
	        HTMLCodeResponse = EntityUtils.toString(entity, HTTP.UTF_8);
	        
	        return HTMLCodeResponse;



Ensuite, je parse le tout avec SAX et je récupère mon JavaBean complété (je suis certains de ces process)

Mais voila le problème, la console Android m'indique que la valeur de retour HTMLCodeResponse contient encore des caractères inconnus (comme "l'écharpe")

Comment faire en sorte que ma valeur de retour contienne des valeurs décodés en UTF8 ?

Merci d'avance,

Pierre
A voir également:

3 réponses

Jay
 
Bonjour,

Essaie de mettre ça dans ton fichier de connexion à la base de données, sur ton serveur PHP.

mysql_query("SET NAMES 'utf8'"); 
0
pipo114
 
Merci pour ta réponse, mais j'ai mis un mysql_set_charset('UTF8'); qui est pris en compte sur ma version de php/mySQL

L'erreur ne vient pas de là, mais sur le décodage lors de la réception de requête POST HTTP de mon programme Java.

Est-ce que quelqu'un a un idée ?

Pipo
0
Jay
 
je sais pas de trop comment tu te charges de faire ta connexion, sinon voici comment moi je l'a fait :

//Connexion
		HttpParams params = new BasicHttpParams();
		HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
		HttpProtocolParams.setContentCharset(params, "UTF-8");


Si tu lis bien, j'ajoute la ligne :
HttpProtocolParams.setContentCharset(params, "UTF-8");
, pour l'encodage.

ps : j'ai bien galéré également pour l'encodage :(.
0
pipo114
 
En fait, grâce à mon code en Java ci-dessous, j'ai le résultat suivant:

<SMSs>l'écharpe<SMS id="18"><dest value="XXXXXXXXX"/><text value="l'écharpe"/><dh value="1332281587"/></SMS>héllo<SMS id="19"><dest value="XXXXXXXXX"/><text value="héllo"/><dh value="1332333759"/></SMS>test<SMS id="17"><dest value="XXXXXXXXX"/><text value="test"/><dh value="1332281387"/></SMS></SMSs>


Jusqu'ici tout va bien.
Mais comment décoder cette string pour obtenir une chaine avec tous les accents parfaitement lisibles ?


Après cela, je parse ce XML avec SAX. J'ai un erreur de parsing après le premier "/" (donc, la fin de la balise dest. Est ce que vous savez d'ou bien le problème ?
0