IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Encodage des string sur une socket


Sujet :

Qt

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut Encodage des string sur une socket
    Slt, j'ai créé un client Qt réseau en C++ et un serveur réseau en C#. (Le problème vient du coté client d'où le post dans la catégorie C++). Le problème c'est quand j'envoie une string sur la socket, j'ai beau l'encoder en Utf8 lors de l'écriture et lors de la lecture, dans les deux cas, ça me mets n'importe quoi dès qu'il y a des caractères spéciaux ! Quelqu'un saurait-il d'où cela pourrait-il venir ?

    Voici mon code en C++ : (client)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	QByteArray paquet;
    	QDataStream out(&paquet, QIODevice::WriteOnly);
     
    	QString messageAEnvoyer = "€#$%éà";
     
    	QByteArray chaine = messageAEnvoyer.toUtf8 ();
    	out << qToBigEndian((quint64) chaine.size());
     
    	socket->write(paquet); // On envoie le paquet
    	socket->write(chaine);
    Serveur (C#) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	Encoding enc = Encoding.UTF8;
    	ulong Taille = BR.ReadUInt64();
     
    	string Str = enc.GetString(BR.ReadBytes((int)Taille));
     
    	Console.WriteLine(Str);
    Merci d'avance !

  2. #2
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    C'est possible d'avoir le texte en sortie (ce que récupère le serveur) correspondant à la chaîne dans le code? Comme ça on pourra voir un peu mieux ce qui se passe.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    Pour ce code, je reçois ça :

    €#$%éÃ

    J'ai également remarqué que quand je mets des caractères spéciaux dans des QLabel, titres de pages, etc, avec Qt, il mes les affiche bizarement aussi ! Peut-être est-ce lié ?

    Merci d'avance !

  4. #4
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Citation Envoyé par barbug Voir le message
    Pour ce code, je reçois ça :

    €#$%éÃ
    Là c'est que la string en sortie est interprétée comme du latin-1(5). Enfin au moins affichée en latin-1. Je me demande si c'est pas au niveau du Console.WriteLine() que c'est mal encodé, une console (cmd) windows n'étant pas en utf-8 par défaut.

    Regarde ce lien de la doc doc, pour voir si c'est bien la console la cause du problème.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    C'est sous linux... Comment faire pour le voir autrement ? Car C# ne propose pas de décodage en latin1... Qt propose le codage mais si je peux pas le décoder, c'est ennuyeux !

    Merci d'avance !

    EDIT : J'ai modifié l'encodage de sortie de la console et toujours le même problème. Nouvelle sortie :

    €#$%éÃ

    Merci d'avance !

  6. #6
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Citation Envoyé par barbug Voir le message
    C'est sous linux...
    Le serveur est sous linux, en C# ?

    Enfin, regarde le lien que j'ai rajouté à mon commentaire précédent pour spécifier l'encodage de la console. De toute façon la chaine doit bien être en utf-8, donc pas de problème pour s'en servir, je pense, je sais pas comment sont gérées les string en C#.

    EDIT: j'ai vu pour l'essai en changeant l'encodage de la console.

    Essaie peut-être sur le forum C#. Moi je vais plus être de grand secours si ça touche au C#.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    OK, je vais aller voir ça vers là-bas ! Toutefois, j'ai modifié mon code et maintenant le serveur revoie tout de suite ce qu'il a lu dans la socket. Donc, je devrais recevoir quelque chose de normal dans le client (en Qt) mais toujours le même problème. Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QByteArray messageRecu = socket->readAll();
    QString Mess = StringFromByteArray(messageRecu);
    Il m'affiche : €#$%éÃÂÂ

    Merci d'avance !

    P.S : C# est portable !

  8. #8
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Est-ce que la console (linux donc) est bien en utf-8. C'est possible que le programme envoie de l'utf-8 vers la console mais que celle-ci reconvertisse en latin-1.

    L'autre chaine ressemble à du triple réencodage entre latin-1 et utf-8.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    J'ai regardé, ma console est bien en UTF8... J'ai également modifié la sortie de Console.WriteLine de C#. Voici mon (nouveau) code client en Qt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	QString messageAEnvoyer = "é";
     
    	QByteArray Taille;
    	QDataStream out(&Taille, QIODevice::WriteOnly);
     
    	QByteArray Chaine = messageAEnvoyer.toUtf8();
    	out << qToBigEndian((quint64) Chaine.size());
     
    	Fen->socket->write(Taille);
    	Fen->socket->write(Chaine);
    Mon (nouveau) code C# :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	Encoding enc = Encoding.UTF8;
    	ulong Taille = BR.ReadUInt64();
     
    	byte[] Tab = BR.ReadBytes((int)Taille);
    	string Str = enc.GetString(Tab);
     
    	Console.OutputEncoding = enc;
    	Console.WriteLine(Taille);
    	Console.WriteLine(Str);
    Et l'affichage du serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    4 // Taille reçue
    é // String reçue
    Cette string est ensuite renvoyée au client qui l'affiche. Voici le résultat :

    En même temps, tous les caractères accentués sont mal affichés chez moi avec Qt... Même genre sur le titre de la fenètre, etc... Serait-ce lié ?

    Merci d'avance !

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    si tu envoie "é" je voie pas trop comment tu avoir une taille de 4

    Demande peut être sur le forum .net.

    Si tu peut faire une simple exemple en Qt et C# je pourrais tester demain.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    Ou alors, j'envoie les sources (de test, il y a 3 fichiers dans chaque et pas compliqué du tout !)

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par barbug Voir le message
    Ou alors, j'envoie les sources (de test, il y a 3 fichiers dans chaque et pas compliqué du tout !)
    oui par exemple.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    Voici les sources. Pour le serveur C#, suffit de l'ouvrir avec mondevelop et Qt, j'ai laissé le .pro

    Serveur : http://www.gigaup.fr/get_file/DD8OCP...uigui-zip.html
    Client : http://www.gigaup.fr/get_file/6S2WOC...eseau-zip.html

    Merci d'avance !

  14. #14
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Commence par rajouter les lignes suivantes à ton main, juste après la création de la QApplication.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    Comme tes fichiers sources sont en utf-8 et non en latin-1, QString interprète mal des chaînes entre guillemets.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par kinji1 Voir le message
    Commence par rajouter les lignes suivantes à ton main, juste après la création de la QApplication.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    Comme tes fichiers sources sont en utf-8 et non en latin-1, QString interprète mal des chaînes entre guillemets.
    ça pourrai expliquer la taille de 4 pour un simple caractère.
    Si se n'est pas cela, je testerai ton code lundi

    [edit]
    Ce plutôt le compilateur qui interprète mal les chaine, non?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    Effectivement, ça marche !!!!

    Merci vraiment beaucoup beaucoup à tous car je commençais vraiment à désespérer !

    Dernière petite question, j'ai cependant un problème d'affichage sur l'interface graphique. Le serveur reçoit bien le "é" mais le client affiche :

    ��

    Peut-on également régler ce problème ?

    Merci d'avance !
    A bientôt !

  17. #17
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Ce plutôt le compilateur qui interprète mal les chaine, non?
    Le compilateur voit un tableau de char qui sont sur un octet, même s'il détecte que le fichier est en utf-8, il n'a pas à interpréter le é qui est sur deux octets comme un seul caractère. S'il essayait de remplacer les caractères sur deux octets ou plus par leur version 1 octet en latin-1 (choix arbitraire), ça ne marcherait pas avec tous les caractères, en plus rien ne dit que le programmeur ne voulait pas écrire 'é' au lieu de 'é'. Donc en mémoire il y a les deux octets et QString qui part défaut est en latin-1 les interprète comme deux caractères et les convertit en unicode.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    Je vais créer un nouveau post pour cette nouvelle question qui s'éloigne pas mal de celle de base.

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encodage d'int sur une socket
    Par barbug dans le forum Qt
    Réponses: 4
    Dernier message: 07/02/2009, 14h29
  2. Réponses: 2
    Dernier message: 26/06/2007, 16h04
  3. Obtenir des infos sur une page web en ligne
    Par Logan_Cale dans le forum Web & réseau
    Réponses: 1
    Dernier message: 20/08/2005, 15h36
  4. Comment avoir des information sur une BD?…
    Par kikimnet dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/02/2005, 09h20
  5. Recupération des selections sur une DBGrille multi Selection
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/11/2004, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo