Les données codées post-UTF-8 sur le serveur perdent certains caractères

Je travaille sur un projet qui comprend la communication du serveur (application JavaEE) et du client (application Android). XML est envoyé comme l’un des parameters POST de la requête HTTP (nommé “xml“). Il y a aussi peu d’autres parameters POST que je transmets au serveur, mais en fonction ci-dessous je les ai supprimés pour plus de simplicité. Le problème est que certaines lettres ne sont pas correctement livrées au serveur – par exemple, le caractère Note (notez que ce n’est pas l’allemand Ü , qui est correctement délivré, au fait). Le code d’envoi est le suivant:

 private Ssortingng postSyncXML(Ssortingng XML) { Ssortingng url = "http://10.0.2.2:8080/DebugServlet/DebugServlet"; HttpClient httpclient = new DefaultHttpClient(); List nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("xml",XML)); UrlEncodedFormEntity form; try { form = new UrlEncodedFormEntity(nameValuePairs); form.setContentEncoding(HTTP.UTF_8); HttpPost httppost = new HttpPost(url); httppost.setEntity(form); HttpResponse response = (HttpResponse) httpclient .execute(httppost); HttpEntity resEntity = response.getEntity(); Ssortingng resp = EntityUtils.toSsortingng(resEntity); Log.i(TAG,"postSyncXML srv response:"+resp); return resp; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } 

J’imagine que ce problème se trouve dans BasicNameValuePair que j’utilise pour définir XML comme l’un des parameters POST, et sa documentation indique qu’il utilise le jeu de caractères US-ASCII. Quelle est la bonne façon d’envoyer des champs POST encodés en UTF-8?

Après beaucoup de recherches et de tentatives pour faire avancer les choses, j’ai finalement trouvé une solution au problème, qui est un simple ajout au code existant. La solution consistait à utiliser le paramètre “UTF-8” dans le constructeur de la classe UrlEncodedFormEntity:

 form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8"); 

Après ce changement, les caractères ont été encodés et livrés correctement du côté du serveur.

Quand tu fais cette ligne

 form = new UrlEncodedFormEntity(nameValuePairs); 

vous devez spécifier le jeu de caractères comme ceci

 form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8"); 

Vous pouvez aller sur Android Developer découvrir.

Construit une nouvelle UrlEncodedFormEntity avec la liste des parameters avec le codage par défaut de DEFAULT_CONTENT_CHARSET

 Ssortingng finalSsortingng = URLEncoder.encode(request, "UTF-8"); return finalSsortingng; 

user finalSsortingng dans votre méthode post.

Ou je peux append le code ci-dessous dans le scriptlet en haut de mon test2.jspx qui résoudra le problème

 Ssortingng en = request.getCharacterEncoding(); if(en == null) { request.setCharacterEncoding("UTF-8"); } 

J’ai également fait face à un problème similaire. Mais pour le vérifier, j’ai écrit ci-dessous deux JSP

————- test1.jspx —————–

    
-------------test2.jspx----------------- The test entered is request.getParameter("u") ----------------------------------

Ensuite, les caractères accentués sont entrés dans la première zone de saisie ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ

Et le problème est clairement visible: le navigateur Android ne peut pas gérer le codage UTF-8 dans les parameters POST.

Je pense que je devrai utiliser la méthode GET et devra append “URIEncoding = UTF-8” pour le connecteur dans tomcat server.xml.

Cela a été le problème Envoi de données UTF-8 à partir d’Android. Votre code fonctionnerait bien, sauf que vous devrez encoder votre Ssortingng en Base64 . Au niveau du serveur PHP, vous venez de décoder Base64 Ssortingng. Cela a fonctionné pour moi. Je peux partager si vous avez besoin du code.