[php/MySQL/Java] Encodage de strings

Fermé
pipo114 - 2 avril 2012 à 11:57
 pipo114 - 2 avril 2012 à 20:47
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

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
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
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
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