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

  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.

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    L'encodage RFC semble assez compliqué à décoder.
    Il y a plusieurs cas de figure possible, et beaucoup de règles à respecter.
    La norme explique tout cela, mais ca me prendrait beaucoup plus de temps que je n'en ai à ma disposition pour ce problème.

    J'ai donc décidé d'utiliser une chtite fonction maison qui va me remplacer un à un les caractères encodés.
    Exemple : "=9E" devient "é"

    Elle nettoie aussi la chaine de caractère, pour ne conserver que le texte en lui-même.
    "=?iso-8859-1?Q?R=E9gis_huhu?=" devient "Régis huhu"

    C'est simple et brutal, mais ca dépanne .
    Je fournit la fonction au cas où quelqu'un en ai besoin un jour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    void MailChecker::decodage(QString & chaine)
    {
    	// VOIR : http://fr.wikipedia.org/wiki/ISO_8859-1
     
    	chaine = chaine.section('?',3,3);
     
    	chaine.replace(QString("_"), QString(" "));
     
    	chaine.replace(QString("=20"), QString(" "));
    	chaine.replace(QString("=21"), QString("!"));
    	chaine.replace(QString("=22"), QString("\""));
    	chaine.replace(QString("=23"), QString("#"));
    	chaine.replace(QString("=24"), QString("$"));
    	chaine.replace(QString("=25"), QString("%"));
    	chaine.replace(QString("=26"), QString("&"));
    	chaine.replace(QString("=27"), QString("'"));
    	chaine.replace(QString("=28"), QString("("));
    	chaine.replace(QString("=29"), QString(")"));
    	chaine.replace(QString("=2A"), QString("*"));
    	chaine.replace(QString("=2B"), QString("+"));
    	chaine.replace(QString("=2C"), QString(","));
    	chaine.replace(QString("=2D"), QString("-"));
    	chaine.replace(QString("=2E"), QString("."));
    	chaine.replace(QString("=2F"), QString("/"));
     
    	chaine.replace(QString("=30"), QString("0"));
    	chaine.replace(QString("=31"), QString("1"));
    	chaine.replace(QString("=32"), QString("2"));
    	chaine.replace(QString("=33"), QString("3"));
    	chaine.replace(QString("=34"), QString("4"));
    	chaine.replace(QString("=35"), QString("5"));
    	chaine.replace(QString("=36"), QString("6"));
    	chaine.replace(QString("=37"), QString("7"));
    	chaine.replace(QString("=38"), QString("8"));
    	chaine.replace(QString("=39"), QString("9"));
    	chaine.replace(QString("=3A"), QString(":"));
    	chaine.replace(QString("=3B"), QString(";"));
    	chaine.replace(QString("=3C"), QString("<"));
    	chaine.replace(QString("=3D"), QString("="));
    	chaine.replace(QString("=3E"), QString(">"));
    	chaine.replace(QString("=3F"), QString("?"));
     
    	chaine.replace(QString("=40"), QString("@"));
    	chaine.replace(QString("=41"), QString("A"));
    	chaine.replace(QString("=42"), QString("B"));
    	chaine.replace(QString("=43"), QString("C"));
    	chaine.replace(QString("=44"), QString("D"));
    	chaine.replace(QString("=45"), QString("E"));
    	chaine.replace(QString("=46"), QString("F"));
    	chaine.replace(QString("=47"), QString("G"));
    	chaine.replace(QString("=48"), QString("H"));
    	chaine.replace(QString("=49"), QString("I"));
    	chaine.replace(QString("=4A"), QString("J"));
    	chaine.replace(QString("=4B"), QString("K"));
    	chaine.replace(QString("=4C"), QString("L"));
    	chaine.replace(QString("=4D"), QString("M"));
    	chaine.replace(QString("=4E"), QString("N"));
    	chaine.replace(QString("=4F"), QString("O"));
     
    	chaine.replace(QString("=50"), QString("P"));
    	chaine.replace(QString("=51"), QString("Q"));
    	chaine.replace(QString("=52"), QString("R"));
    	chaine.replace(QString("=53"), QString("S"));
    	chaine.replace(QString("=54"), QString("T"));
    	chaine.replace(QString("=55"), QString("U"));
    	chaine.replace(QString("=56"), QString("V"));
    	chaine.replace(QString("=57"), QString("W"));
    	chaine.replace(QString("=58"), QString("X"));
    	chaine.replace(QString("=59"), QString("Y"));
    	chaine.replace(QString("=5A"), QString("Z"));
    	chaine.replace(QString("=5B"), QString("["));
    	chaine.replace(QString("=5C"), QString("\\"));
    	chaine.replace(QString("=5D"), QString("]"));
    	chaine.replace(QString("=5E"), QString("^"));
    	chaine.replace(QString("=5F"), QString("_"));	
     
    	//chaine.replace(QString("=60"), QString(""));
    	chaine.replace(QString("=61"), QString("a"));
    	chaine.replace(QString("=62"), QString("b"));
    	chaine.replace(QString("=63"), QString("c"));
    	chaine.replace(QString("=64"), QString("d"));
    	chaine.replace(QString("=65"), QString("e"));
    	chaine.replace(QString("=66"), QString("f"));
    	chaine.replace(QString("=67"), QString("g"));
    	chaine.replace(QString("=68"), QString("h"));
    	chaine.replace(QString("=69"), QString("i"));
    	chaine.replace(QString("=6A"), QString("j"));
    	chaine.replace(QString("=6B"), QString("k"));
    	chaine.replace(QString("=6C"), QString("l"));
    	chaine.replace(QString("=6D"), QString("m"));
    	chaine.replace(QString("=6E"), QString("n"));
    	chaine.replace(QString("=6F"), QString("o"));
     
    	chaine.replace(QString("=70"), QString("p"));
    	chaine.replace(QString("=71"), QString("q"));
    	chaine.replace(QString("=72"), QString("r"));
    	chaine.replace(QString("=73"), QString("s"));
    	chaine.replace(QString("=74"), QString("t"));
    	chaine.replace(QString("=75"), QString("u"));
    	chaine.replace(QString("=76"), QString("v"));
    	chaine.replace(QString("=77"), QString("w"));
    	chaine.replace(QString("=78"), QString("x"));
    	chaine.replace(QString("=79"), QString("y"));
    	chaine.replace(QString("=7A"), QString("z"));
    	chaine.replace(QString("=7B"), QString("{"));
    	chaine.replace(QString("=7C"), QString("|"));
    	chaine.replace(QString("=7D"), QString("}"));
    	chaine.replace(QString("=7E"), QString("~"));
     
    	chaine.replace(QString("=A0"), QString(" "));
    	//chaine.replace(QString("=A1"), QString(""));
    	//chaine.replace(QString("=A2"), QString(""));
    	//chaine.replace(QString("=A3"), QString(""));
    	//chaine.replace(QString("=A4"), QString(""));
    	//chaine.replace(QString("=A5"), QString(""));
    	chaine.replace(QString("=A6"), QString("|"));
    	//chaine.replace(QString("=A7"), QString(""));
    	//chaine.replace(QString("=A8"), QString(""));
    	//chaine.replace(QString("=A9"), QString(""));
    	//chaine.replace(QString("=AA"), QString(""));
    	//chaine.replace(QString("=AB"), QString(""));
    	//chaine.replace(QString("=AC"), QString(""));
    	//chaine.replace(QString("=AD"), QString(""));
    	//chaine.replace(QString("=AE"), QString(""));
    	//chaine.replace(QString("=AF"), QString(""));
     
    	//chaine.replace(QString("=B0"), QString(""));
    	//chaine.replace(QString("=B1"), QString(""));
    	//chaine.replace(QString("=B2"), QString(""));
    	//chaine.replace(QString("=B3"), QString(""));
    	//chaine.replace(QString("=B4"), QString(""));
    	//chaine.replace(QString("=B5"), QString(""));
    	//chaine.replace(QString("=B6"), QString(""));
    	//chaine.replace(QString("=B7"), QString(""));
    	//chaine.replace(QString("=B8"), QString(""));
    	//chaine.replace(QString("=B9"), QString(""));
    	//chaine.replace(QString("=BA"), QString(""));
    	//chaine.replace(QString("=BB"), QString(""));
    	//chaine.replace(QString("=BC"), QString(""));
    	//chaine.replace(QString("=BD"), QString(""));
    	//chaine.replace(QString("=BE"), QString(""));
    	//chaine.replace(QString("=BF"), QString(""));
     
    	//chaine.replace(QString("=C0"), QString(""));
    	//chaine.replace(QString("=C1"), QString(""));
    	//chaine.replace(QString("=C2"), QString(""));
    	//chaine.replace(QString("=C3"), QString(""));
    	//chaine.replace(QString("=C4"), QString(""));
    	//chaine.replace(QString("=C5"), QString(""));
    	//chaine.replace(QString("=C6"), QString(""));
    	//chaine.replace(QString("=C7"), QString(""));
    	//chaine.replace(QString("=C8"), QString(""));
    	//chaine.replace(QString("=C9"), QString(""));
    	//chaine.replace(QString("=CA"), QString(""));
    	//chaine.replace(QString("=CB"), QString(""));
    	//chaine.replace(QString("=CC"), QString(""));
    	//chaine.replace(QString("=CD"), QString(""));
    	//chaine.replace(QString("=CE"), QString(""));
    	//chaine.replace(QString("=CF"), QString(""));
     
    	//chaine.replace(QString("=D0"), QString(""));
    	//chaine.replace(QString("=D1"), QString(""));
    	//chaine.replace(QString("=D2"), QString(""));
    	//chaine.replace(QString("=D3"), QString(""));
    	//chaine.replace(QString("=D4"), QString(""));
    	//chaine.replace(QString("=D5"), QString(""));
    	//chaine.replace(QString("=D6"), QString(""));
    	//chaine.replace(QString("=D7"), QString(""));
    	//chaine.replace(QString("=D8"), QString(""));
    	//chaine.replace(QString("=D9"), QString(""));
    	//chaine.replace(QString("=DA"), QString(""));
    	//chaine.replace(QString("=DB"), QString(""));
    	//chaine.replace(QString("=DC"), QString(""));
    	//chaine.replace(QString("=DD"), QString(""));
    	//chaine.replace(QString("=DE"), QString(""));
    	//chaine.replace(QString("=DF"), QString(""));
     
    	chaine.replace(QString("=E0"), QString("à"));
    	//chaine.replace(QString("=E1"), QString(""));
    	chaine.replace(QString("=E2"), QString("â"));
    	chaine.replace(QString("=E3"), QString("ã"));
    	chaine.replace(QString("=E4"), QString("ä"));
    	//chaine.replace(QString("=E5"), QString(""));
    	//chaine.replace(QString("=E6"), QString(""));
    	chaine.replace(QString("=E7"), QString("ç"));
    	chaine.replace(QString("=E8"), QString("è"));
    	chaine.replace(QString("=E9"), QString("é"));
    	chaine.replace(QString("=EA"), QString("ê"));
    	chaine.replace(QString("=EB"), QString("ë"));
    	//chaine.replace(QString("=EC"), QString(""));
    	//chaine.replace(QString("=ED"), QString(""));
    	chaine.replace(QString("=EE"), QString("î"));
    	chaine.replace(QString("=EF"), QString("ï"));
     
    	//chaine.replace(QString("=F0"), QString(""));
    	chaine.replace(QString("=F1"), QString("ñ"));
    	//chaine.replace(QString("=F2"), QString(""));
    	//chaine.replace(QString("=F3"), QString(""));
    	chaine.replace(QString("=F4"), QString("ô"));
    	chaine.replace(QString("=F5"), QString("õ"));
    	chaine.replace(QString("=F6"), QString("ö"));
    	//chaine.replace(QString("=F7"), QString(""));
    	//chaine.replace(QString("=F8"), QString(""));
    	//chaine.replace(QString("=F9"), QString(""));
    	//chaine.replace(QString("=FA"), QString(""));
    	chaine.replace(QString("=FB"), QString("û"));
    	chaine.replace(QString("=FC"), QString("ü"));
    	//chaine.replace(QString("=FD"), QString(""));
    	//chaine.replace(QString("=FE"), QString(""));
    	chaine.replace(QString("=FF"), QString("ÿ"));
    }

+ 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