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

C++ Discussion :

char et std::cout encodage.


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 50
    Points : 60
    Points
    60
    Par défaut char et std::cout encodage.
    Bonjour à tous!

    Est-ce que quelqu'un pourrait m'expliquer pourquoi l'affichage d'un caractère ne correspond pas au contenu souhaité?

    Je déclare un caractère que j'affiche aussitôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char c = 'é';
    int entier = ((int)c) & 0xFF;
    cout << c << ", " << entier << endl;
    Affiche sur ma console: Ú, 233.

    A noter qu'un petit appel CharToOEM de ce caractère permet l'affichage du bon caractère sur la console (Il en est de même pour tous les autres caractères de mon clavier Ô,Û,...).

    Pourquoi ma console se comporte t-elle comme cela?

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il y a trois jeux de caractères à considérer dans le cas des littéraux de chaînes:
    - celui utilisé pour le fichier
    - celui utilisé pour l'exécutable
    - celui utilisé par l'environnement d'exécution.

    Avec ce que tu donnes, l'exécutable encode les chaînes en ISO-8859-1 ou, plus vraisemblablement dans le cas de Windows, CP 1252, alias MS-ANSI. C'est le jeu de caractères utilisé par les versions "occidentales" de Windows avant la généralisation d'Unicode.

    L'environnement d'exécution lui a l'air de les interpréter comme du CP-850. (C'était le jeu de caractères utilisé par les versions "occidentales" de DOS).

    Il faut soit indiquer au compilateur que les chaines doivent utiliser CP-850 (gcc a une option -fexec-charset=... pour ça), soit configurer ta console pour utiliser CP 1252 (je sais que ça se fait, je sais pas comment).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Merci beaucoup!

    Effectivement, j'ai affiché tous les caractères correspondants à tous les entiers entre 0 et 255: l'environnement d'exécution interprète les caractères comme du CP-850 (Latin-1).

    Ensuite, le caractère Ú est numéroté 233 (0xE9) de la page de code 850. Le caractère numéro 0xE9 du CP1252 est bien le é.

    Je vais regarder côté compilation comment définir le jeux de caractères et je reviens poster la réponse.

    Aussi as-tu parlé du jeux de caractères pour le fichier (pour la console?). Comment puis-je savoir de quelle manière il a été encodé?

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par thomas41 Voir le message
    Merci beaucoup!

    Effectivement, j'ai affiché tous les caractères correspondants à tous les entiers entre 0 et 255: l'environnement d'exécution interprète les caractères comme du CP-850 (Latin-1).
    Latin-1 c'est un autre nom pour ISO 8859-1, c'est pas du tout CP-850, c'est presque CP1252 (plus precisement, CP1252, c'est latin-1 plus une assignation de caracteres graphiques dans la zone CR, reservee aux caracteres de controles dans latin-1).

    Je vais regarder côté compilation comment définir le jeux de caractères et je reviens poster la réponse.
    Note que je n'ai aucune idee comment c'est fait, ni si c'est possible. Le seul compilateur que je connaisse qui permette d'avoir un codage different pour l'executable et les fichiers est gcc - du moins c'etait le cas la derniere fois que j'ai regarde (mais j'utilise pas Windows, donc j'en sais rien du tout pour VC++).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    C'est un faux problème, généralement limité aux débutants de nos jours -- vu que ce sont quasiment les seuls à vouloir faire des programmes en console DOS qui affichent des textes en français avec accents.

    Règle ta console pour bosser comme toi, i.e. en latin1 ou équivalent.
    Typiquement avec un chcp 1252 dans l'invite msdos, voire en utilisant une console qui est en latin1 (comme p.ex. la console de cygwin).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Je crois que j'ai compris. Merci à tous deux pour vos réponses.

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

Discussions similaires

  1. plantage std::cout avec VS 2005
    Par globule71 dans le forum Visual C++
    Réponses: 35
    Dernier message: 16/04/2007, 20h56
  2. Réponses: 2
    Dernier message: 25/10/2006, 18h09
  3. convertir un char* en std::basic_string
    Par gronaze dans le forum SL & STL
    Réponses: 8
    Dernier message: 30/06/2006, 15h17
  4. std::cout et std::wstring
    Par glKabuto dans le forum SL & STL
    Réponses: 11
    Dernier message: 10/06/2006, 18h44
  5. convertir un char * en std::string
    Par benahpets dans le forum SL & STL
    Réponses: 12
    Dernier message: 01/05/2006, 17h15

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