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

Allegro Discussion :

Probème d'affichage d'accents


Sujet :

Allegro

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut Probème d'affichage d'accents
    Bonjour

    J'utilise allegro5 et dans mon programme j'affiche des mots avec des accents.
    et j'ai un problème d'affichage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          std::string chaine=survolee->getInfo(0);
          al_draw_text(police1,al_map_rgb(255,255,255),10,40,0,chaine.c_str());
          ALLEGRO_USTR* ustr=al_ustr_new(chaine.c_str());
          al_draw_ustr(police1,al_map_rgb(255,255,255),10,10,0,ustr); 
          al_draw_text(police1,al_map_rgb(255,255,255),10,70,0,"56ème");
          std::string chaine2="56ème";
          al_draw_text(police1,al_map_rgb(255,255,255),10,100,0,chaine2.c_str());
    la première ligne de code renvoie la chaine "56ème" et c'est ce qui doit être affiché. Ce contenu est chargé à partir d'un fichier qui contient bien les codes ASCII (en hexa) 35 36 E8 6D 65
    La seconde ligne de code n'affiche que 56 comme si la chaine de caractère ne contenait que 56
    Pensant qu'il s'agissait d'un problème d'encodage en UTF8 j'ai utilisé le type ALLEGRO_USTR mais le résultat est identique à la seconde ligne de code à savoir 56
    Pour tester j'ai mis le texte en dur dans le programme pour l'afficher et ça fonctionne la 5ème ligne de code affiche bien 56ème
    Enfin j'ai mis ce texte dans une std::string et l'affichage fonctionne.
    J'ai l'impression que pour une raison inconnue un 0 terminal est mis juste avant le è Comme si la chaine était codée 35 36 00 E8 6D 65
    Quelqu'un a t'il déjà eu ce problème
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je n'ai pas eu de souci de ce genre, mais les soucis d'encodage, je connais un peu. Si vous voulez que la chaîne soit en unicode (ou en wide char), il faut utiliser la macro L avant la chaîne de caractère (ce qui fait que cela sera un wchar*).
    Le constructeur de std::string semble faire une transformation, faisant que cela marche (changement d'encodage ?).
    Aussi, il faut voir avec quel encodage vous enregistrez le fichier source.
    Êtes vous sous Windows ou Linux ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Je suis sous Windows et j'utilise Code::Blocks comme outils de développement.
    Pour ce qui est de l'encodage les fichiers sources sont en UTF8.
    Le constructeur de std::string semble faire une transformation, faisant que cela marche (changement d'encodage ?).
    Je n'en suis pas sur mais le problème vient peut être de la façon dont je lit ma chaine de caractère dans le fichier
    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
     
    for(int j=0; j<3; j++)
      {
        int n = 0;
        fread(&n, sizeof(int),1,pFic);// lecture du nombre de caractère dans la chaine
        if (n != 0)
        {
          char c;
          for (int i = 0; i < n; i++)
          {
            fread(&c, 1,sizeof(char),pFic);// lecture d'un caractère
            info[j] += c;// ajout du caractère à la chaine
          }
        }
      }
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Ce code me surprend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    info[j] += c;// ajout du caractère à la chaine
    Pourquoi un ajout (au sens addition) dans la case du tableau.
    Aussi, là, vous lisez char par char, alors que vous avez des caractères accentués, donc du widechar.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Ce code me surprend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    info[j] += c;// ajout du caractère à la chaine
    Pourquoi un ajout (au sens addition) dans la case du tableau.
    c'est pas au sens addition c'est une concaténation (opérateur + de la std::string) et info est un tableau de 3 std::string

    Citation Envoyé par LittleWhite Voir le message
    Aussi, là, vous lisez char par char, alors que vous avez des caractères accentués, donc du widechar.
    Non j'ai bien du char dans mon fichier. Par ailleurs la plus part des caractères accentués existent dans la table ASCII ils ont simplement des code au delà de 127 mais inférieur à 255. Comme le "è" qui a pour code hexadécimal E8

    Je lis caractère par caractère car au début j'ai eu des soucis de lecture et je me retrouvais avec des chaines de caractères plus grandes que ce que prévu. J'ai fini par trouver le bug et j'ai maintenant remplacé ce code de lecture par celui ci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char* buff=new char[n+1];
          fread(buff, n,sizeof(char),pFic);
          buff[n]=0;
          info[j] = buff;
          delete buff;
    Mais ça ne résout en rien mon problème.
    En fait lorsque je regarde le contenu de ma chaine en mémoire j'ai bien "56ème" qui est codé 35 36 00 E8 6D 65
    Mais lorsque je l'affiche avec les routines d'allégro c'est comme s'il faisait une analyse du code de chaque caractère et dès que celui ci est supérieur à 127, il rajoute un octet à 0. Ce qui après est interprété comme la fin de la chaine et du coup seul 56 s'affiche.
    Par contre cette analyse ne semble pas avoir lieu quand le texte est dans le code en dur.
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    En fait lorsque je regarde le contenu de ma chaine en mémoire j'ai bien "56ème" qui est codé 35 36 00 E8 6D 65
    Ici, on voit qu'il y a bien le caractère terminal '00' (autrement dit \0). Du coup, comme vous avez des chaines en char (pas de wide char), la chaîne est traitée octet par octet. Au troisième octet, fin de chaîne. Il faudrait avoir une wide char, ou la chaîne correcte serait : 00 35 00 36 00 E8 00 6D 00 65 00 00.
    Ce que je ne comprends pas trop, c'est pourquoi il y a un 00 en plus (devant E8). Il semble que le caractère soit converti en wide char, mais au final, que celui-ci. Par contre, avec un débogage pas à pas, on devrait voir quand il arrive.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    En lisant votre réponse je m'apperçoit que je me sui mal exprimé
    J'ai écrit
    En fait lorsque je regarde le contenu de ma chaine en mémoire j'ai bien "56ème" qui est codé 35 36 00 E8 6D 65
    Il fallait lire
    En fait lorsque je regarde le contenu de ma chaine en mémoire j'ai bien "56ème" qui est codé 35 36 E8 6D 65
    Le 00 n'existe pas en mémoire.

    D'ou l'importance de bien se relire
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

Discussions similaires

  1. [AJAX]probème d'affichage de traitement
    Par jeandormesson dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/08/2006, 16h28
  2. Réponses: 1
    Dernier message: 22/12/2005, 15h45
  3. Réponses: 1
    Dernier message: 21/11/2005, 11h37
  4. Problème d'affichage d'accent - latin1
    Par damjal dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/05/2005, 17h06
  5. Réponses: 11
    Dernier message: 16/12/2003, 19h58

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