locked
Problème d'encodage de caractères json RRS feed

  • Question

  • Bonjour à vous ,

    J'envoie des données json à mon serveur mais petit problème l'encodage des caractères spéciaux ne fonctionne pas :  

    pour le mot détails , les logs à la réception du serveur sont comme cela dxc3xa9tails 

    plutôt que d'être comme ça : d\xc3\xa9tails

    Dans mon output quand je log les données avant leur envoie elles ne sont même pas encodé puisque j'y voit "détails".

    Avez vous une idée d'où peut provenir le problème ? Merci


    Florian R SAS

    lundi 26 janvier 2015 14:45

Réponses

  • Le probléme vient de la classe 

    "MARequest"

     postStream.Write(byteArray, 0, data.Length);
    
    // remplacé par 
    
     postStream.Write(byteArray, 0, byteArray.Length);
    il semblerait bien que le problème venait de là.


    Florian R SAS

    • Marqué comme réponse Florian R SAS vendredi 20 mars 2015 08:36
    jeudi 29 janvier 2015 15:32

Toutes les réponses

  • Bonjour,

    Quelle méthode utilisez-vous pour l'encodage ?

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    lundi 26 janvier 2015 14:59
  • Je le fait de cette façon :

    JObject jsonData = new JObject();
    
    JToken scdToken = JsonConvert.SerializeObject(jsonData, Formatting.None);
    String jsonToSend = scdToken.ToString();

    Merci


    Florian R SAS

    lundi 26 janvier 2015 15:02
  • Bonjour,

    Les servers encode certains caractères pour éviter les attaques de script à partir des base de données.

    Tu peux soit mettre ta page en mode 

    Page ValidateRequest="false"

    ou utililiser les fonctions

    Server.HtmlDecode()

    Server.HtmlEncode()

    C'est un peu plus délicat mais ça ne désactive pas ta sécurité.

    Par contre pour une grille que tu veux binder, tu dois créer une liste virtuel de ta

    table de bd à partir d'un forEach in et c'est au cours du remplissage de cette liste

    que tu utilise cette méthode.

    un exemple :

    textbox1.text = server.htmlDecode(mavaleurextraitedemabd)


    Jbenon

    lundi 26 janvier 2015 15:08
  • Bonjour,

    Les servers encode certains caractères pour éviter les attaques de script à partir des base de données


    Jbenon

    Bonjour Jbenon,

    Il ne semble pas que cela soit le problème car lorsque j'envoie ces données au serveur avec Android je n'ais pas de problème, je pense vraiment que cela vient de windows phone car il manque les \


    Florian R SAS

    lundi 26 janvier 2015 15:10
  • re

    J'ai le même problème que je suis en train de régler pour exprimer un "m²" ou un "carré".

    Voici ce qui est enregistré dans ma bd pour "mélange à béton"

    Mélange à béton

    la méthode server.htmldecode me remet le bon terme dans mes outils d'affichage.

    Bonne journée.

    jacky


    Jbenon

    lundi 26 janvier 2015 15:21
  • Bonjour,

    Pour éviter ceci, je vous conseil d'apliquer vous même une méthode d'encodage des caractères, qui soit commune dans toutes vos applications utilisant la même base de données (ou services).

    Les échanges de texte sont parfois frustrants.

    Personnellement j'utilise la technique proposée par Jbenon.

    HtmlEncode/HtmlDecode.

    Cette méthode d'encodage permet de transformer tous les caractères spéciaux en caractères imprimables (ce que le \... n'est pas puisque c'est un caractère d'échappement).

    De plus cette méthode permet de se prémunir des attaques par injection comme le precise Jbenon.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    lundi 26 janvier 2015 15:37
  • Merci de vos réponses.

    je ne peut pas utiliser cette solution car le fonctionnement est déjà en place côté serveur avec android et ios.

    C'est donc bien un problème soit de la librairie, soit de la façon dont les données sont envoyées au serveur :

     public MARequest(RequestListener requestListener)
            {
                this.listener = requestListener;
                //allDone.WaitOne();
            }
    
            public void Execute(String url, String postData )
            {
    
                this.url = url;
                this.data = postData;
                listener.OnPreExecute();
    
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.Headers[HttpRequestHeader.ContentEncoding] = "text/html";
                request.ContentType = "application/x-www-form-urlencoded";
             
                request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
    
            }
    
            private  void GetRequestStreamCallback(IAsyncResult asynchronousResult)
            {
                try
                {
    
                    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
                    byte[] byteArray = Encoding.UTF8.GetBytes(data);
    
                    Stream postStream = request.EndGetRequestStream(asynchronousResult);
                    postStream.Write(byteArray, 0, data.Length);
                    postStream.Close();
    
                    // Start the asynchronous operation to get the response
                    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
    
                }
                catch (WebException e)
                {
                    SdkLog.WriteLine(e.Message);
                } 
            }
    
            private void GetResponseCallback(IAsyncResult asynchronousResult)
            {
                HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
                HttpWebResponse response = null;
                try
                {
                    response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
                    Stream streamResponse = response.GetResponseStream();
                    StreamReader streamRead = new StreamReader(streamResponse);
                    string responseString = streamRead.ReadToEnd();
                    SdkLog.WriteLine(responseString);
                    // Close the stream object
                    streamResponse.Close();
                    streamRead.Close();
                    // Release the HttpWebResponse
                    response.Close();
                    listener.OnPostExecute(responseString, response.StatusCode, MobilAirTools.GetDomainName(url));
                }
                catch (WebException e)
                {
                    SdkLog.WriteLine(e.Message);
                    listener.OnPostExecute(e.Message, HttpStatusCode.NotFound , MobilAirTools.GetDomainName(url));
                }
            }
        }


    Florian R SAS

    mardi 27 janvier 2015 09:14
  • Bonjour Floriant,

    Tu travailles en C#, moi en Vb, je n'ai pas le temps de tout analyser ton code.

    Je te répète le principe : le server enregistre tes données après les avoir encodées, donc à la lecture tu

    obtiens des informations qui n'ont pas été décodées. Tu dois décoder à l’extraction pour rétablir tes données.

    La méthode citée s'applique, tu dois trouver ou et comment.

    Pour le ou , je viens de te le préciser, le comment est relatif à l'affichage, si tu travaille en requêtes LINQS ou non,

    (elles ne reconnaissent pas la méthode ) tu dois appliquer la méthode à chaque champ extrait.

    Pour les requêtes LINQS, j'ai crée une liste virtuelle à chaque fois, et lorsque j'affecte mon champ de liste à un

    objet,  c'est la que je met cette méthode :   monobjet.text =  server.htlmdecode(mavaleur de champ)

    Bon courage

    jacky


    Jbenon

    mardi 27 janvier 2015 11:02
  • Le probléme vient de la classe 

    "MARequest"

     postStream.Write(byteArray, 0, data.Length);
    
    // remplacé par 
    
     postStream.Write(byteArray, 0, byteArray.Length);
    il semblerait bien que le problème venait de là.


    Florian R SAS

    • Marqué comme réponse Florian R SAS vendredi 20 mars 2015 08:36
    jeudi 29 janvier 2015 15:32
  • Effectivement,

    Plus logique d'utiliser la longueur du tableau que l'on passe en paramètre que celle d'un autre tableau. Mais en théorie, peu de chance que ce soit cela qui pose problème.

    Et, je ne vois pas en quoi ce serait l'origine de votre erreur de base.

    Quoi qu'il en soit, est-ce que votre problème est résolu ?

    • Si oui, merci de noter la réponse qui l'a résolu,
    • Si non, où en êtes vous ?

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    vendredi 30 janvier 2015 14:41