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 :

[Qt 4.2.2] QTcpSocket, QByteArray et encodage de caractères


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut [Qt 4.2.2] QTcpSocket, QByteArray et encodage de caractères
    Bonjour,

    J'utilise une QTcpSocket pour interroger un serveur de messagerie.
    Ce dernier m'envoie une réponse sur ma socket et lui indique l'auteur du mail.
    Cette réponse est stockée dans un QByteArray comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // socket_r : ma socket qui transporte le message
    // data : mon QByteArray qui stocke l'auteur du mail
     
    socket_r->readLine(data.data(), data.size());
    Jusque là, ca fonctionne.
    J'affiche alors l'auter du message dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << "Réponse du serveur : \t" << data.constData() << std::endl;
    Ce qui me produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =?iso-8859-1?Q?R=E9gis?= <reg@reg.fr>
    Mon problème se situe donc au niveau de l'encodage, et je ne parviens pas à le résoudre (C'est un problème récurrent dans mes projets ).
    J'obtiens "R=E9gis" au lieu de "Régis", dans le cas présent...

    J'ai essayé de travailler sur cet encodage en utilisant le passage au Latin1, mais sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << "Réponse du serveur : \t" << QString::fromLatin1(data.constData()).toStdString() << std::endl;
    J'avoue que je ne sais pas trop comment gérer le chose.
    Auriez-vous une idée ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    Citation Envoyé par Nyphel
    J'affiche alors l'auter du message dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << "Réponse du serveur : \t" << data.constData() << std::endl;
    Ce qui me produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =?iso-8859-1?Q?R=E9gis?= <reg@reg.fr>
    Mon problème se situe donc au niveau de l'encodage, et je ne parviens pas à le résoudre (C'est un problème récurrent dans mes projets ).
    J'obtiens "R=E9gis" au lieu de "Régis", dans le cas présent...
    C'est un encodage propres au mail me semble-t-il. Il n'y a rien dans Qt pour gérer ça à ma connaissance, mais une recherche dans Google devrait apporter quelques pistes, par exemple subject encoding: What's =?ISO-8859-1?Q?.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    Plutôt que de repartir de zéro (à moins que ce ne soit dans un but éducatif) pourquoi ne pas utiliser une bibliothèque existante, par exemple VMime, libEtPan! ou IP*Works! ?

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Et en fait j'étais partis sur vmime mais j'ai rencontré d'importants problèmes d'installations/utilisation sur Win2000/Qt4.2.2/MingW... Et pratiquement aucune aide.

    J'ai alors décidé de coder ma propre classe, étant donné que mes besoins sont extrêmements limités : interroger un serveur de messagerie sur IMAP/IMAPs et récupérer les en-têtes des nouveaux messages (Sujet, date, auteur).
    Il ne m'est pas utile de pouvoir envoyer des mails, ni de supporter POPx, SMTP, ...

    Je pense que cette solution allègera mon appication, car l'un de ses impératif majeur est de minimiser les ressources nécessaires à son fonctionnement.

    Merci pour ces pistes, et les liens vers ces autres librairies.
    libEtPan! m'intéresse tout de même pas mal...

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    D'après le Wiki :
    La norme ISO 8859-1, dont le nom complet est ISO/CEI 8859-1, et qui est souvent appelée Latin-1, forme la première partie de la norme internationale ISO/CEI 8859, qui est une norme de l'Organisation internationale de normalisation pour le codage des caractères en informatique. Elle définit ce qu'elle appelle l'alphabet latin numéro 1, qui consiste en 191 caractères de l'alphabet latin, chacun d'entre eux étant codé par un octet (soit 8 bits).
    Et d'après la documentation Qt :
    QString QString::fromLatin1 ( const char * str, int size = -1 ) [static]

    Returns a QString initialized with the first size characters of the Latin-1 string str.
    If size is -1 (the default), it is taken to be qstrlen(str).
    Je ne comprends donc pas vraiment quel est le problème .


    [EDIT]
    Ah ca y'est je comprends : j'obtiens une QString qui contient du Latin1.
    En somme il faut que je parvienne à le décoder...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut
    Effectivement, cet encodage bizarre n'a rien à voir directement avec ISO 8859-1, mais plutôt avec la RFC 2407.

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

Discussions similaires

  1. Probleme d'encodage des caractères spéciaux
    Par pacoulitou24 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 20/06/2006, 16h47
  2. Encodage de caractères
    Par Anduriel dans le forum Langage
    Réponses: 13
    Dernier message: 25/04/2006, 18h22
  3. Réponses: 15
    Dernier message: 24/02/2006, 14h17
  4. [FLASH 8] Encodage de caractères...
    Par Xdrei dans le forum Flash
    Réponses: 1
    Dernier message: 24/02/2006, 07h44
  5. encodage de caractères
    Par hugo123 dans le forum Langage
    Réponses: 7
    Dernier message: 25/01/2006, 15h04

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