begin process at 2012 05 27 13:20:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > 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

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Classé sous :caractères accentués, Windows, mode console, ASCII OEM Niveau :Débutant Date de création :13/12/2011 Date de mise à jour :16/12/2011 09:14:51 Vu / téléchargé :2 694 / 68

Auteur : pgl10

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 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

Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE
Source avec Zip Source avec une capture CONVHTML : UN UTILITAIRE DE CONVERSION POUR FICHIERS HTML
Source avec Zip Source avec une capture AFFIMOFF : UNE VISIONNEUSE 3D AVEC PARAMÉTRISATION ET TEXTUR...
Source avec Zip Source avec une capture CRIBLE D'ERATOSTHÈNE OPTIMISÉ
Source avec Zip Source avec une capture UN INTERPRÉTEUR POUR RATIONNELS DE GRANDES TAILLES

 Sources de la même categorie

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture LECTURE FRÉQUENCE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10
Source avec Zip PETITE CLASSE DE GESTION DES PROCESSUS SOUS WINDOWS par wisar

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SOKOBAN EN C POUR DÉBUTANT (VERSION AMÉLIORÉE BASÉE SUR LE T... par eustatika
Source avec Zip [MYLIB] GESTION DE FICHIERS par Galaad2908
Source avec Zip PROTECTION AU DÉMARAGE DE WINDOWS ET PENDANT par daminator2
Source avec Zip MODIFIER RAPIDEMENT SON FICHIER HOST par sholvaC
Source avec Zip Source avec une capture LA CONJECTURE DE SIERPINSKI par pgl10

Commentaires et avis

Commentaire de Renfield le 14/12/2011 07:10:20 administrateur CS

un petit :

setlocale( LC_CTYPE , "fra" ) ;

issu de clocale.h

et zou...

Commentaire de pgl10 le 14/12/2011 10:41:11

Merci Renfield. C'est une information complémentaire qui intéressera de nombreux visiteurs. A noter que dans http://www.cppfrance.com/code.aspx?ID=53813 fredg19 a écrit dans jour_naissance.cpp : #include <clocale> ... setlocale(LC_ALL, "french"); pour le même besoin. Mais chez moi chacune de ces deux solutions voisines se compile bien mais ne fonctionne pas. Je suppose que d'autres auraient le même résultat que moi.

Commentaire de fredg19 le 16/12/2011 14:59:41

J'approuve PGL10, je crois que le #include <clocale> est la meilleure solution pour les accents.

Commentaire de FraGag le 19/12/2011 03:42:39

Je n'ai jamais essayé setlocale, mais je sais que SetConsoleCP et SetConsoleOutputCP permettent de définir l'encodage de la console. En passant 1252 aux deux fonctions, la console fonctionnera avec la page de codes 1252. Si je me souviens bien, on peut même spécifier 65001 pour que la console fonctionne en UTF-8; on a alors accès à tous les caractères Unicode (tant que la police utilisée dans la console a les glyphes correspondants).

Commentaire de Jojo Lancien le 19/12/2011 17:16:01 10/10

Le débutant que je suis est en admiration devant cet exemple d'utilisation de la surcharge en cpp. Les commentaires m'ont également beaucoup appris et, jamais plus, je n'écrirai de programme console qui affiche incorrectement les accents. Mais, bien sûr, celà ne résout pas complètement le problème OEM/ANSI car si on tape la commande
main.exe >texte.txt
seules les lignes non converties seront correctes si on ouvre texte.txt avec le bloc-note.  

Commentaire de pgl10 le 19/12/2011 18:43:59

Merci Jojo Lancien. L'objectif ici est seulement d'avoir facilement un affichage correct en mode console sous Windows. Convertir les lignes d'un fichier texte.txt serait assez facile. Mais dans quel but ? A quoi servirait le fichier converti ? Le programme Convhtml à : http://www.cppfrance.com/code.aspx?ID=53789 effectue un autre type de conversion pour tous les fichiers .htm ou .html d'un dossier. On pourrait l'adapter facilement avec ou sans appel à CharToOemA().

Commentaire de pgl10 le 20/12/2011 21:39:18

Jojo Lancien,
Je reprends ici ma réponse faite trop rapidement.
C'est tout à fait exact, si on fait ici : main.exe > texte.txt
On obtient un fichier texte.txt inutilisable.
Mais on peut le corriger facilement avec un montrer.bat : montrer.exe texte.txt console.txt
et le fichier simplifié montrer.cpp suivant :
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
using namespace std;
int main(int argc, char *argv[]) {
    ifstream ifs(argv[1]);
    ofstream ofs(argv[2]);
    string s;
    while (getline(ifs, s)) {
        char* buf;
        buf = new char[s.size()+1];
        OemToChar(s.c_str(), buf);
        s = buf;
        delete [] buf;
        ofs << s << endl;
    }
    return 0;
}
Le fichier console.txt obtenu est conforme à l'affichage ayant été envoyé dans texte.txt
Merci d'avoir indiqué un complément pouvant être utile à certains besoins.

Commentaire de Jojo Lancien le 21/12/2011 08:50:25

Cette réponse me satisfait, en effet, mieux que la précédente. J'en avais conçu le principe, mais, devant la première réponse, j'avais craint d'être importun.
Avec ce nouveau code, le résultat devient vraiment parfait.

Commentaire de Renfield le 21/12/2011 10:56:03 administrateur CS

vues les manipulations requises, ca tend a me rassurer dans mes choix: ne pas mettre d'accent dans mes consoles ^^

Commentaire de pgl10 le 21/12/2011 12:21:33

Renfield et FraGag,
Merci beaucoup d'avoir indiqué comment on peut éviter le problème ou comment le traiter autrement. Il y a probablement encore d'autres solutions ( Unicode ... ). Et celle-ci peut admettre des variantes. A chacun de faire son choix.

 Ajouter un commentaire


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 &gt; 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 &gt; 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales