Accueil > > > POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE CONSOLE
POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE CONSOLE
Information sur la source
Description
Le code ASCII de base a été mis au point pour la langue anglaise, il ne contient donc pas de caractères accentués, ni de caractères spécifiques à une langue. Il a été ensuite étendu pour apporter des solutions à ce besoin. Deux codages particuliers ont été ainsi définis : le code ASCII étendu OEM, défini aux débuts des PC IBM, c'est celui qui est encore utilisé pour les affichages en mode console sous Windows, et le code ASCII étendu ANSI utilisé par les autres systèmes d'exploitation. C'est pourquoi il est très utile de pouvoir afficher correctement des mots ayant des caractères accentués de manière très voisine et avec très peu de changement en passant d'une environnement à l'autre. C'est ce que s'efforce de faire la solution ci-jointe construite grâce à plusieurs échanges avec CptPingu. L'explication est la suivante. En C++, il n'est pas possible de redéfinir l'opérateur << pour un type pod (plain old data, type classique comme int, double, char, etc.). L'opérateur << pour les std::string existant déjà, il y aurait eu ambiguïté. La solution consiste en une astuce simple : on définit une classe d'encapsulation pour les std::string, ce qui permet d'avoir un nouveau type. La surcharge n'existant pas pour ce type, on peut donc redéfinir l'opérateur << pour ce type équivalent au std::string. Et comme le std::string convertit le char*/char[] reçu en entrant cela fonctionne aussi pour le type char*/char[]. Merci CptPingu.
Source
- //------------------------ fichier oem.hpp ---------------------------
- #ifndef OEM_HPP
- #define OEM_HPP
- #include <windows.h>
-
- struct SetOEM
- {
- explicit SetOEM(const std::string& s)
- : _s(s)
- {
- }
- const std::string _s;
- };
-
- inline SetOEM
- OEM(const std::string& s)
- {
- return s;
- }
-
- std::ostream&
- operator<<(std::ostream& out, const SetOEM& oem)
- {
- char* s = new char[oem._s.size() + 1];
- CharToOemA(oem._s.c_str(), s);
- out << s;
- delete [] s;
- return out;
- }
-
- #endif // OEM_HPP
- //------------------------ fichier main.cpp --------------------------
- #include <iostream>
- #include <string>
- #include "oem.hpp"
- int main()
- {
- const char caf[] = "Les caractères français doivent être convertis";
- const std::string str = "Noëlle aperçut là-bas l'âne bâté";
- std::cout << std::endl;
- std::cout << OEM("Démo de OEM() n° 1 : ") << OEM(caf) << std::endl << std::endl
- << OEM("Démo de OEM() n° 2 : ") << OEM("Cet été fut très chaud !") << std::endl << std::endl
- << "Mais sans OEM() : " << "Cet été fut très chaud !" << std::endl << std::endl
- << OEM("Démo de OEM() n° 3 : ") << OEM(str) << std::endl << std::endl
- << "Mais sans OEM() : " << str << std::endl << std::endl
- << std::endl << "Au revoir !" << std::endl << std::endl;
- getchar();
- return 0;
- }
//------------------------ fichier oem.hpp ---------------------------
#ifndef OEM_HPP
#define OEM_HPP
#include <windows.h>
struct SetOEM
{
explicit SetOEM(const std::string& s)
: _s(s)
{
}
const std::string _s;
};
inline SetOEM
OEM(const std::string& s)
{
return s;
}
std::ostream&
operator<<(std::ostream& out, const SetOEM& oem)
{
char* s = new char[oem._s.size() + 1];
CharToOemA(oem._s.c_str(), s);
out << s;
delete [] s;
return out;
}
#endif // OEM_HPP
//------------------------ fichier main.cpp --------------------------
#include <iostream>
#include <string>
#include "oem.hpp"
int main()
{
const char caf[] = "Les caractères français doivent être convertis";
const std::string str = "Noëlle aperçut là-bas l'âne bâté";
std::cout << std::endl;
std::cout << OEM("Démo de OEM() n° 1 : ") << OEM(caf) << std::endl << std::endl
<< OEM("Démo de OEM() n° 2 : ") << OEM("Cet été fut très chaud !") << std::endl << std::endl
<< "Mais sans OEM() : " << "Cet été fut très chaud !" << std::endl << std::endl
<< OEM("Démo de OEM() n° 3 : ") << OEM(str) << std::endl << std::endl
<< "Mais sans OEM() : " << str << std::endl << std::endl
<< std::endl << "Au revoir !" << std::endl << std::endl;
getchar();
return 0;
}
Conclusion
Comme le montre le main() on peut afficher en C++ sous Windows en mode console avec l'ASCII étendu OEM des mots ayant des caractères accentués d'une manière très voisine de ce qui serait fait si ce mode utilisait l'ASCII étendu ANSI. Et de cette manière la portabilité éventuelle dans un autre environnement est extrêmement facile à effectuer. On peut aussi noter que par rapport à la solution utilisant setlocale on a ici la possibilité de mélanger les caractères spéciaux de plusieurs langues et de plus c'est compatible avec les compilateurs et systèmes anciens.
Historique
- 13 décembre 2011 21:26:38 :
- Pour ajouter le zip.
- 14 décembre 2011 15:29:36 :
- Prise en compte des std::string
- 14 décembre 2011 18:35:42 :
- une amélioration pour plus de généralité
- 16 décembre 2011 09:14:51 :
- Pour une compilation plus facile
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Probleme OCX [ par lallthis ]
je suis sous windows 98, et je souhaite enregistrer un ocx qui est seulement sous windows NT4Comment faire?C assez urgent, c pour un projet de bts.Si
Windows ? [ par Clem ]
C'est bien tout ça, mais pour windows ? Comment créér une fenêtre avec des combo, des button, des images et des labels et changer le texte de certains
Pause le chargement de windows puis le reprendre AIDEZ MOI PLEASE [ par Cyberdevil ]
Hello,J'ai une question :, est ce que c'est possible de "pauser" tous les processus en cours puis de les relancer en faite ce que je veux c'est inter
portage Linux vers visual C++ [ par acsx ]
Salut,J'ai un programme écrit en C sous Linux et je souhaite le faire tourner sous Visual C++ 6.0 sous Windows.J'ai donc créé un projet win32 et intég
probleme de police [ par elladan ]
j'ai installe de la ram ( 32 Mo ) qui etait grille mais windows la quand meme reconnue et a modifie des parametres du registre: mais il n'arrivait pas
Problème de ligne sur Windows 98/Me [ par Toumhor ]
Voilà mon problème:Lorsque je créé un stylo (HPEN) avec la méthode CreatePen avec une épaisseur > 2, les lignes que je trace avec LineTo ont des ex
Problème de tracé de lignes sur Windows 98/Me [ par Toumhor ]
Voilà mon problème:Lorsque je créé un stylo (HPEN) avec la méthode CreatePen avec une épaisseur > 2, les lignes que je trace avec LineTo ont des ex
un GROS DEBUTANT qui a besoin d'aide, app. windows [ par stephane ]
bonjour,je débute en c++, je programme déja en visual basic, je connais un peu la syntaxe de c++, mais ma question :j'ai acheter un livre c++ pour m'a
Question sur Windows.h [ par GoldenEye ]
Connaissez vous un site qui propose la description des fonctions de Windows.h ( même question pour dos.h )MerciGoldenEye
AIDEZ MOI !!!!!! [ par mathieu ]
salut,je viens de monter un pc :carte mère : MSI K7T 266 PROcarte graphique : Geforce 2 GTS winfast (LeadTek)256 mo de ram DDRet je rencontre un probl
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|