web-dev-qa-db-fra.com

La publication de données codées UTF-8 sur le serveur perd certains caractères

Je travaille sur un projet qui comprend la communication du serveur (application JavaEE) et du client (application Android). XML est envoyé en tant que l'un des paramètres POST de la requête HTTP (nommé "xml"). Il existe également quelques autres paramètres POST que je transmets au serveur, mais dans la fonction ci-dessous, je les ai supprimés pour plus de simplicité. Le problème qui se produit est que certaines lettres ne sont pas correctement remises au serveur - par exemple le caractère Ű (Notez que ce n'est pas l'allemand Ü, qui est bien livré, soit dit en passant). 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 suppose que ce problème est dans le BasicNameValuePair que j'utilise pour définir XML comme l'un des paramètres POST, et sa documentation indique qu'il utilise le jeu de caractères US-ASCII. Quelle est la bonne façon d'envoyer UTF- 8 POST champs encodés?

42
dstefanox

Après beaucoup de recherches et de 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 consistait à utiliser le paramètre "UTF-8" dans le constructeur de classe UrlEncodedFormEntity:

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

Après cette modification, les caractères ont été encodés et remis correctement côté serveur.

100
dstefanox

Quand tu fais cette ligne

form = new UrlEncodedFormEntity(nameValuePairs);

vous devez spécifier le jeu de caractères comme celui-ci

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

Vous pouvez aller à Android Developer découvrir.

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

21
BobGao
String finalString = URLEncoder.encode(request, "UTF-8");

return finalString;

utilisateur finalString dans votre méthode de publication.

3
AZ_

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


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

Cela a été le problème lors de l'envoi de données UTF-8 depuis Android. Votre code fonctionnerait bien sauf que vous devrez encoder votre String en Base64. Sur le serveur PHP vous venez de décoder Base64 Chaîne en arrière. Ça a marché pour moi. Je peux partager si vous avez besoin du code.

0
Mukund K Roy

J'ai également rencontré un problème similaire. Mais pour le vérifier, j'ai écrit ci-dessous deux JSP

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

Ensuite, saisissez les caractères accentués ci-dessous dans la première zone de saisie.

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

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

0
Amol Gaikwad