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 :

Problème encodage depuis une socket


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Problème encodage depuis une socket
    Bonjour à tous et à toutes.

    Je me suis lancé il y a peu dans le développement d'un client IRC via Qt.
    Tout marche comme je le souhaite (connexions/gestion des trames venant du serveur) sauf que je ne sais pas du tout comment encoder correctement un message venant du serveur (comme vous pouvez le voir ici http://postimg.org/image/iupq9cdm1/ ).. J'en suis au point où je m'arrache les cheveux... j'ai tout essayé : des heures sur Google, du changement en code html sur le tas, des methodes comme QString::fromUtf8/fromLatin1 etc...

    Evidemment, j'utilises les QTcpSocket.

    Personne aurait une idée de comment faire ?

    Merci pour vos futurs réponses, et bonne soirée à vous.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Sur ta capture, il y a plein d'accents qui sont correctement affichés. Si j'en crois le message, c'est de l'UTF-8, donc tu affiches correctement l'UTF-8. En revanche, la partie entre crochets est probablement en Windows-1252 (dit aussi Latin1, ASCII, ANSI, ISO-8859-1... même si y'a quelques différences). Si tu t'amuses à afficher cette page en encodage UTF-8 tu verras les mêmes carrés noirs �. Donc je ne sais pas comment tu reçois ce message, sous quel format, est-ce que c'est un bloc compacte ou des morceaux que tu rassembles, mais en tout cas le bout de message foireux doit subir un toUtf8().data() pour bien s'afficher.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Merci pour ta réponse.

    Pour récupérer les données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Client::readDatas() {
        QString readBuffer = _socket->readLine();
        Parser p;
        if(readBuffer.length() > 0) {
            emit newMessage(p.treatMessage(readBuffer));
        }
        if(_socket->canReadLine()) readDatas();
    }
    C'est un slot lié au signal "readyRead" de QTcpSocket

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Ça ne m'aide pas beaucoup, déjà je ne connais pas QTcpSocket, mais surtout ce qui serait intéressant c'est d'avoir un exemple de message mal encodé (readBuffer) et savoir ce que tu fais déjà dans le treatMessage() pour avoir le résultat sur la capture.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    QTcpSocket c'est juste une socket connectée au réseau irc, et il suffit de connecter quelques signaux, notamment readyRead(), qui est émit lorsque des données sont reçues sur la socket. Ma méthode readDatas permet juste de récupérer ces données (les données transmises sur le réseau ne sont que du texte (pour l'instant)).

    Concernant treatMessage(), cette methode me permet uniquement de formatter le texte pour le formaliser en une pseudo-trame que je peux interpreter par la suite dans mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    QString Parser::treatMessage(QString message) {
        QString _emitter = emitter(message);
        QString _code = code(message);
        QString _parameters = parameters(message);
     
        QString m;
        m = QString("[EMITTER|%1=%2][CODE|%3=%4][PARAMETERS|%5=%6]").arg(QString::number(_emitter.length()))
                .arg(_emitter)
                .arg(QString::number(_code.length()))
                .arg(_code)
                .arg(QString::number(_parameters.length()))
                .arg(_parameters);
        return m;
    }
    Ce qui me permettra de passer de ça

    :roubaix2.fr.epiknet.org NOTICE AUTH :*** No ident response; username prefixed with ~
    à ça
    [EMITTER|23=roubaix2.fr.epiknet.org]
    [CODE|6=NOTICE]
    [PARAMETERS|53=AUTH :*** No ident response; username prefixed with ~]
    (J'ai sauté la ligne par soucis de lisibilité)

    Et donc il m'arrive de recevoir ce genre des messages avec des signes bizarres

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Désolé pour l'oublie de mise en forme des parties de codes, je ferai plus attention à l'avenir

Discussions similaires

  1. [XL-2010] Problème insertion depuis une textbox dans une cellule
    Par Phifou dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/09/2014, 11h50
  2. problème encodage depuis migration mysql 5
    Par speedev dans le forum MySQL
    Réponses: 1
    Dernier message: 08/07/2010, 05h30
  3. problème affichage depuis une bd en webservice
    Par i_mt2 dans le forum Services Web
    Réponses: 1
    Dernier message: 10/04/2010, 18h49
  4. readBytes depuis une socket
    Par Corvus dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 16/07/2009, 18h04
  5. Réponses: 7
    Dernier message: 30/01/2006, 22h36

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