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 :

[console Windows] Caractères accentués


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut [console Windows] Caractères accentués
    Salut,

    J'ai cherché sur les forums mais probablement que je n'utilise pas les bons mots clés car je ne trouve pas ce qui me satisferait.

    Voilà mon problème. Dans mon code, quand je fais un mon programme affiche en console :
    CaractÞres
    De ce que j'ai trouvé sur le Net, c'est que la classe "string" gère chaque caractères ASCII en signed char... ou quelque chose du genre donc, de -128 à 127 au lieu de 0 à 255...

    Donc, dans ce cas, le caractère "è" a la valeur "-24" ce qui donne un caractères qui n'a pas le sens que je veux. Moi ce que je veux c'est le caractère "138" et j'aimerais bien que ce caractère soit afficher normalement sans que j'ai à utiliser d'artifice quelconque dans mon code. Bien sûr, je voudrais que cela s'applique à tous les caractères au-delà de 127 jusqu'à 255.

    Est-ce que j'ai bien expliqué?
    Quelqu'un connait une solution?

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    Par défaut
    Effectivement, la recherche avancée n'est pas très douée ...
    -> http://www.google.fr/search?q=accent...nsole+hermitte
    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...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Merci beaucoup pour le lien

    Malheureusement, je trouve que ces solutions sont peu conviviales pour ce que je veux faire. Alors, je me suis fait un petit bout de code à moi.

    Je vous avertis, je ne suis pas un pro du tout !
    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
    string accents(string source)
    {
    	for(unsigned int i=0; i < source.size(); i++)
    	{
    		switch(source.at(i))
    		{
    			case 'à' : source.at(i) = char(133); break;
    			case 'À' : source.at(i) = char(183); break;
    			case 'é' : source.at(i) = char(130); break;
    			case 'É' : source.at(i) = char(144); break;
    			case 'è' : source.at(i) = char(138); break;
    			case 'È' : source.at(i) = char(212); break;
    			case 'ê' : source.at(i) = char(136); break;
    			case 'Ê' : source.at(i) = char(210); break;
    			case 'ö' : source.at(i) = char(148); break;
    			case 'Ö' : source.at(i) = char(153); break;
    			case 'ù' : source.at(i) = char(151); break;
    			case 'Ù' : source.at(i) = char(235); break;
    			case 'û' : source.at(i) = char(150); break;
    			case 'Û' : source.at(i) = char(234); break;
    			case 'ç' : source.at(i) = char(135); break;
    			case 'Ç' : source.at(i) = char(128); break;
    			default:break;
    		}
    	}
     
    	return source;
    }
    et voilà ! Comme la fonction retourne une string, je peux l'utiliser facilement à peu près n'importe où. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << accents("Caractères à é ê ö ù û ç") << endl;
    Évidemment, on peut ajouter tous les autres caractères... ceci était juste un test avec les accents de base.

    Je suis sûr qu'il peut y avoir mieux, mais si ça peut aider quelqu'un, tant mieux.

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    Par défaut
    Altérer ton programme est une fausse bonne idée.
    Altère plutôt ta console.
    -> chcp 1252
    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...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Ça me donne le même résultat... même que c'est pire parceque quand je tappe au clavier des caractères accentués, ça me donne les mêmes caractères incompréhensible.... Avant de faire cette commande, quand je tappais "à" au moins il m'affichait "à" (comme lors d'une saisie avec cin). C'était seulement ce qu'il y avait dans mon code qui était affiché de la mauvaise façon. Avec la commande que tu viens de me donner, là c'est tout qui n'est pas bon

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    La console utilise le code page "DOS Latin 1" (pour conserver un semblant de compatibilité avec les anciens programmes) (CP #437)
    De plus la console utilise par défaut une police de caractère "Terminal" qui est une police Raster.

    1. Changer la police de la console (Lucida Console par exemple)
    2. Changer le code-page de la console "chcp 1252"
    et ca devrait rouler....

    Maintenant, la console est 'sensée' savoir gérer de l'unicode. Récupère donc le stream unicode, et balance ton unicode dedans sans te préoccuper du codepage.


    Enfin, dernière possibilité, encoder directement en 437....

    Si tu as l'unicode (si tu commences à gérer des accents, ca veut dire que tu devrais déjà être en unicode), un simple wcstombcs avec comme code-page de destination 437...

    Sinon, ben il faudra passer par l'UNICODE (mbcstowcs(ANSI_CP,...) puis wcstombcs(437,...)).

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Citation Envoyé par nicroman Voir le message
    1. Changer la police de la console (Lucida Console par exemple)
    2. Changer le code-page de la console "chcp 1252"
    et ca devrait rouler....
    Ouais, ça roule nickel !.... Mais ce n'est pas un peu compliquer de faire ça à chaque fois... (ce que je veux dire par là c'est de dire à toutes les personnes qui utiliseront mon programme de modifier leur console pour pouvoir utiliser mon programme correctement... )

    Citation Envoyé par nicroman Voir le message
    Maintenant, la console est 'sensée' savoir gérer de l'unicode. Récupère donc le stream unicode, et balance ton unicode dedans sans te préoccuper du codepage.
    Wow, oui, j'adorerais faire cela ! C'est quoi l'Unicode ?? mdr ! Non, sans blague, je sais que c'est une façon d'encoder les caractères pour permettre l'utilisation de tous les caractères possibles dans toutes les langues... Mais bon, c'est tout ce que je sais là-dessus, encore moins comment récupèrer un stream unicode en C++ !

    Citation Envoyé par nicroman Voir le message
    Enfin, dernière possibilité, encoder directement en 437....
    Ça me semble intéressant, mais obsolète, non?

    Citation Envoyé par nicroman Voir le message
    Si tu as l'unicode (si tu commences à gérer des accents, ca veut dire que tu devrais déjà être en unicode), un simple wcstombcs avec comme code-page de destination 437...

    Sinon, ben il faudra passer par l'UNICODE (mbcstowcs(ANSI_CP,...) puis wcstombcs(437,...)).
    Je vais regarder de ce côté... Est-ce que tu n'aurais pas des références qui parle de la gestion de l'unicode en C++? Au pire, je vais chercher de mon côté.

    Merci beaucoup de ton aide.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Maintenant, la console est 'sensée' savoir gérer de l'unicode. Récupère donc le stream unicode, et balance ton unicode dedans sans te préoccuper du codepage.
    Ah bon? On peut envoyer de l'UTF-* sur la console?

    Ouahhh!

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    Par défaut
    Citation Envoyé par sekiryou Voir le message
    Ouais, ça roule nickel !.... Mais ce n'est pas un peu compliquer de faire ça à chaque fois... (ce que je veux dire par là c'est de dire à toutes les personnes qui utiliseront mon programme de modifier leur console pour pouvoir utiliser mon programme correctement... )
    Vraiment ?
    Souvent les accents sous windows, c'est un faux problème de débutant. On croit en avoir besoin jusqu'au moment où l'on quitte la console ou le français.

    Plus tous les problèmes posés : un résultat compatible OEM-850 sera incompatible avec des éditeurs/outils qui attendent du latin-1/windows-1252. Sans parler que ce petit programme ne pourra pas être compilé sur d'autres OS, ou même exécuté simplement dans une console cygwin.

    Paramétrer la console une bonne fois pour toute est très certainement la meilleure solution.
    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...

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Paramétrer la console une bonne fois pour toute est très certainement la meilleure solution.
    Mais, les jolis caractères semi-graphiques?

    Quelqu'un y pense, aux caractères semi-graphiques?

  11. #11
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    Par défaut
    PDCurses est mon ami
    Plus sérieusement. Si le produit (je ne parle pas de programme d'apprentissage) ciblé dès le début pour la console windows, c'est une autre histoire.
    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...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    PDCurses est mon ami
    Plus sérieusement. Si le produit (je ne parle pas de programme d'apprentissage) ciblé dès le début pour la console windows, c'est une autre histoire.
    Je connaissais Curses et/ou NCurses (de nom, il va sans dire !) pour les systèmes Unix... mais j'ai cru comprendre qu'il était extrêmement difficile (voir impossible?) de le porter sous Win32. PDCurses me semble une bonne idée. Je vais regarder ce qu'il a à offrir. J'espère que ce n'est pas trop difficile à utiliser

    Merci pour ce conseil.

  13. #13
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    Par défaut
    Disons que c'est très ... C.
    Mais si tu veux faire une interface textuelle, c'est probablement la meilleure solution disponible. PDCurses pour windows, PDCurses ou (n)curses pour *nix.
    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...

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Bon je sais que c'est peut-être pas l'endroit pour demander ça, mais étant donné que ça suit le flot du post... je vais le faire ici.

    En fait, le message s'adresse surtout à Luc Hermitte.

    Je suis allé sur le site de PDCurses sur SourceForge... Sauf les sources, y'a 4 choix de fichiers contenant des Dlls.
    - pdc33dll;
    - pdc33dllw;
    - pcd33dllu;
    - pdc33dlls.

    Ils ne parlent nul part de la différence entre chacun... Quelqu'un la connait?

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Par défaut
    Est-ce que l'encodage unicode C99 fonctionnerait partout ?
    Ça fonctionne chez moi (Mac)... ça fonctionne sur mes Suns... ça fonctionne sur les Windows de nos labs.... Est-ce un coup de chance ?

    C'est quelque chose que je n'ai jamais exploré, car comme le dit Luc... on s'en fout (enfin il ne le dit pas comme ça)

    Ainsi avec iconv c'est facile de faire la conversion du code source.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Garulfo@Archimede $ echo "éè" | iconv -f UTF-8 -t C99
    \u00e9\u00e8

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Bon, je viens tout juste d'essayer de compiler tous les démos venant avec le source de pdcurses. Je ne me souviens plus quelle DLL j'ai utilisée, mais je les compiles tous sans erreur !...

    Donc, je suppose que ça fonctionne peu importe laquelle j'utilise... détail !

    Merci encore Luc Hermitte, des heures et des heures de plaisir le nez dans la doc pour savoir comment faire fonctionner cette bête. Mais au moins, je sais qu'elle fonctionne

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Je vais mettre le post résolu étant donné que mon problème de base semble réglé avec la venu de PDCurses...

    Merci à tous pour vos réponses.

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 14/09/2013, 21h35
  2. Réponses: 11
    Dernier message: 03/12/2009, 15h09
  3. [Débutant] Pb caractères accentués sous console dos
    Par remitbo dans le forum Langage
    Réponses: 5
    Dernier message: 04/01/2007, 14h34
  4. Réponses: 6
    Dernier message: 14/07/2005, 14h25
  5. Caractères accentués en mode console
    Par Koubiacz dans le forum C++
    Réponses: 2
    Dernier message: 13/05/2005, 07h07

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