42 votes

L'envoi de données codées UTF-8 au serveur perd certains caractères

Je travaille sur un projet qui comprend la communication entre le serveur (application JavaEE) et le client (application Android). Le XML est envoyé comme l'un des paramètres POST de la requête HTTP (nommé "xml"). Il y a également quelques autres paramètres POST que je passe au serveur, mais dans la fonction ci-dessous je les ai supprimés pour des raisons de simplicité. Le problème qui se pose est que certaines lettres ne sont pas correctement transmises au serveur - par exemple le caractère Ű (Notez que ce n'est pas de l'allemand Ü (qui est d'ailleurs correctement livré). Le code d'envoi est le suivant :

private String postSyncXML(String XML) {
    String url = "http://10.0.2.2:8080/DebugServlet/DebugServlet";
    HttpClient httpclient = new DefaultHttpClient();  

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    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();  
        String resp = EntityUtils.toString(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;
}

Je pense que le problème se situe dans la paire BasicNameValuePair que j'utilise pour définir le XML comme l'un des paramètres POST. La documentation indique qu'elle utilise le jeu de caractères US-ASCII. Quelle est la bonne façon d'envoyer des champs POST codés en UTF-8 ?

100voto

dstefanox Points 1351

Après de nombreuses recherches et tentatives pour faire fonctionner les choses, j'ai finalement trouvé une solution au problème, qui est un simple ajout au code existant. La solution était d'utiliser le paramètre "UTF-8" dans le constructeur de la classe UrlEncodedFormEntity :

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

Après cette modification, les caractères étaient encodés et transmis correctement au serveur.

21voto

BobGao Points 181

Lorsque vous faites cette ligne

form = new UrlEncodedFormEntity(nameValuePairs);

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

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

Vous pouvez vous rendre sur le site Android Developer pour le découvrir.

Construit une nouvelle UrlEncodedFormEntity avec la liste des paramètres avec l'encodage par défaut de DEFAULT_CONTENT_CHARSET

3voto

AZ_ Points 7127
String finalString = URLEncoder.encode(request, "UTF-8");

return finalString;

utilisateur finalString dans votre méthode post.

1voto

Amol Gaikwad Points 11

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

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

0voto

Amol Gaikwad Points 1

J'ai également rencontré le même problème. Mais pour le vérifier, j'ai écrit les deux JSP suivantes

-------------test1.jspx-----------------

<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
  <jsp:directive.page contentType="text/html; charset=utf-8"/>
<body>
      <form action="/test2.jspx" method="POST" accept-charset="UTF-8">
                            <input type="text" name="u" id="u" />
                            <input type="submit" value="Login3" />
    </form>
</body>
</html>

-------------test2.jspx-----------------
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">

<jsp:directive.page contentType="text/html; charset=utf-8"/>
<body>
    The test entered is <jsp:expression>request.getParameter("u")</jsp:expression>
</body>
</html>
----------------------------------

Puis, vous avez saisi les caractères accentués ci-dessous dans le premier champ de saisie. ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ

Et le problème est clairement visible : le navigateur Android ne peut pas gérer l'encodage UTF-8 dans les paramètres POST.

Je pense que je vais devoir utiliser la méthode GET et ajouter "URIEncoding=UTF-8" pour le connecteur dans tomcat server.xml.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X