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 :

Conversion d'une chaîne de caractères de UTF8 vers cp-1252 ?


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2013
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 35
    Points : 25
    Points
    25
    Par défaut Conversion d'une chaîne de caractères de UTF8 vers cp-1252 ?
    Bonjour,

    Je développe une appli pour piloter un afficheur à LEDs : des EPL330
    http://www.eplconcept.com/index.php/...rs-mono-lignes

    Jusque la tout va bien, la doc sur le protocole est relativement bien faite et j'arrive à faire afficher mes infos sur le ruban de led en envoyant des commandes en TCP...

    Le problème apparait lorsque je veux afficher des caractères spéciaux, et notamment des caractères accentués. Dans ce cas il ne m'affiche tout simplement rien !

    Donc pour afficher des chiffres et des lettres en minuscules et majuscules pas de problème. Mais impossible de gérer les accents.

    Je me dis que c'est peut être en rapport avec l'encodage utilisé par Qt différent de celui géré par les EPL330.

    Dans la doc des EPL330 il y deux formats possibles : le CP437 (aussi appelé PLS) et le CP1252 (windows 1252 ou encore latin-9 si j'ai bien compris), à priori j'utiliserai ce dernier.

    comment être sur que ce que j'envoie respecte le format Windows-cp-1252 ?

    J'ai actuellement ceci :

    - l'envoi de "A\r\n" affiche "A" sur la barre de LEDs.
    - l'envoi de "{A}\r\n" affiche "a" sur la barre de LEDs.
    - l'envoi de "é\r\n" n'affiche rien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QByteArray text = \r\n";
    ledClient->sendText(text);
    Pour envoyer un texte par TCP j'utilise la fonction :

    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
     
    bool TCPClient::sendText(QByteArray command)
    {
        if (socket->state() != QAbstractSocket::ConnectedState)
        {
            qWarning() << "Couldn't send command : not connected !";
            return false;
        }
        if(socket->write(command))
        {
            if(socket->waitForBytesWritten(2000) && socket->waitForReadyRead((2000)))
            {
                socket->readAll();
            }
        }
        timer->start(timeout);
        return true;
    }
    Pensez vous que cela vienne d'un problème d'encodage de caractères ? si oui comment y remédier.
    Sinon avez-vous une piste ?

    Merci pour votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 222
    Points : 766
    Points
    766
    Par défaut
    Bonjour,

    Je ne connais pas du tout l'afficheur LED, en supposant que ce soit bien un problème d'encodage, d'un manière général il faut bien distinguer trois choses:

    • l'encodage utilisé dans ton fichier source: c'est géré par ton éditeur, un bon éditeur te permettra de choisir l'encodage que tu veux, je te conseil UTF-8 pour programmer en Qt mais je ne crois qu'il y ait spécialement de règle
    • l'encodage que le compilateur et le framework va utiliser pour interpréter les chaînes en dur dans ton code. Je crois que dans les dernières version de Qt c'est UTF-8 par défaut (d'où le fait de faire des sources en UTF-8), c'est sans doute paramétrable dans le fichier .pro. Sinon tu peux ajouter ces lignes dans tes sources (pour un source en UTF-8)

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      	QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")) // pour toutes les conversion char* vers QString;
      	QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // quand utilise la fonction QObject::tr
      En remplaçant "UTF-8" par l'encodage utilisé pour tes sources.
    • l'encodage que tu utilises pour envoyer l'info à ton afficheur LED, c'est (apparemment) l'opération que tu fais quand tu fabrique ton QByteArray. pour spécifier l'encodage à utiliser, tu utilises le QTextCodec adéquat pour fabriquer le QByteArray, par exemple pour encoder en latin9 la chaine contenue dans un QString:

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
          QString chaine("blablabla");
          QTextCodec* latin9Codec = QTextCodec::codecForName( "ISO-8859-15" );
          QByteArray chaineBrute = latin9Codec->fromUnicode( chaine );
      Evidemment, encore faut-il que le caractère existe dans l'encodage cible, j'ignore si Qt connait toujours l'encodage "cp-1252" je crois que ça dépend de la plateforme. De mémoire cp-1252 (c'est bien l'encage utilisé par windows?) n'est pas très différent de latin1 ou latin9...


    En tout cas, vérifie et test bien les 3 points car je vois souvent un joli méli-mélo d'erreurs sur les questions d'encodage.

    En espérant que ça t'aide

Discussions similaires

  1. Conversion d'une chaîne de caractère (UTF-8)
    Par aristide13 dans le forum Android
    Réponses: 2
    Dernier message: 28/05/2014, 01h50
  2. Conversion d'une chaîne de caractères en quint64
    Par dida_plt dans le forum Débuter
    Réponses: 6
    Dernier message: 14/03/2012, 22h33
  3. Conversion d'un nombre en une chaîne de caractère
    Par nasix dans le forum Général Java
    Réponses: 6
    Dernier message: 25/05/2010, 13h11
  4. Réponses: 4
    Dernier message: 21/09/2005, 17h35
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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