begin process at 2012 05 28 16:17:13
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

System

 > 

Afficher les caractères accentués sous Windows en mode console


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Afficher les caractères accentués sous Windows en mode console

mardi 13 décembre 2011 à 08:38:59 | Afficher les caractères accentués sous Windows en mode console

pgl10

Bonjour,
Pour afficher correctement les caractères accentués sous Windows en mode console il faut utiliser le codage ASCII étendu OEM. Pour faire la conversion automatiquement je propose :
/**************** fichier oem.h ****************/
#include <windows.h>
char* ca(const char* s) { // pour convertir en code ASCII OEM
char* c = new char[strlen(s)+1]; // une chaine de caractères
CharToOem(s,c);
return c;
}
std::string sa(const std::string &s) { // pour convertir en code
char* c = new char[s.size()+1]; // ASCII OEM une string
CharToOem(s.c_str(),c);
std::string t = c;
delete [] c;
return c;
}
/**************** fichier main.cpp ****************/
#include <iostream>
#include <string>
#include "oem.h"
int main () {
char caf[] = "Les caractères français doivent être convertis";
std::string str = "Cet été fut chaud";
std::cout << std::endl << ca("Démo de ca() n° 1 : ") << ca(caf) << std::endl;
std::cout << std::endl << ca("Démo de ca() n° 2 : ") << ca("Noëlle aperçut là-bas l'âne bâté") << std::endl;
std::cout << std::endl << sa("Démo de sa() n° 1 : ") << sa(str) << std::endl;
std::cout << std::endl << "Le texte ci-dessus a : " << sa(str).size() << ca(" caractères") << std::endl;
std::cout << std::endl << sa("Démo de sa() n° 2 : ") << sa("C'est bientôt fini !") << std::endl;
std::cout << std::endl << std::endl << "Au revoir !" << std::endl << std::endl;
getchar();
return 0;
}
Ce problème a déjà été traité, exemple : http://www.cppfrance.com/code.aspx?ID=29633
Mais ici c'est une solution plus spécialisée et plus simple. J'ai toutefois une question :
dans oem.h il y a : char* c = new char[...]; mais il n'y a nulle part un : delete [] c;
s'il en faut un, où le programmer ? Merci.
mardi 13 décembre 2011 à 09:00:53 | Re : Afficher les caractères accentués sous Windows en mode console

pgl10

A la fin de sa(){} c'est un : return t; et non pas : return c; Excusez la faute ! Merci.
mardi 13 décembre 2011 à 09:08:51 | Re : Afficher les caractères accentués sous Windows en mode console

pgl10

Le : char* c = new char[...]; qui n'a pas un : delete [] c; et qui pose le problème c'est celui du ca(){}. En faut-il un ? où ? Merci.
mardi 13 décembre 2011 à 11:16:47 | Re : Afficher les caractères accentués sous Windows en mode console

CptPingu

Administrateur CodeS-SourceS
Bonjour pgl10.

Et bien, il faut récupérer ce que te renvoie "ca", et te charger toi même de la suppression:
Ex:
Code C/C++ :
// [...]
char* tmp = ca(caf);
std::cout << tmp << std::endl;
delete [] tmp;
// [...]


PS: Pense aux balises de code :)

________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mardi 13 décembre 2011 à 12:08:49 | Re : Afficher les caractères accentués sous Windows en mode console

pgl10

Merci CptPingu.

Oui bien sûr. Je comprends bien ta réponse qui est tout à fait correcte. Merci. Mais mon objectif était de remplacer l'exemple suivant où il y a un problème d'accents :

std::cout << std::endl << "Démo de ca() n° 1 : " << caf << std::endl;

par quelquechose de très voisin. Je préfère encore, faute de mieux, faire :

/**************** fichier oem.h ****************/
#include <iostream>
#include <windows.h>
void ca(const char* s) {
char* c;
c = new char[strlen(s)+1];
CharToOem(s,c);
std::cout << c;
delete [] c;
}
/**************** fichier main.cpp ****************/
#include <iostream>
#include "oem.h"
int main () {
char caf[] = "Les caractères français doivent être convertis";
std::cout << std::endl; ca("Démo de ca() n° 1 : "); ca(caf); std::cout << std::endl;
std::cout << std::endl; ca("Démo de ca() n° 2 : "); ca("Noëlle aperçut là-bas l'âne bâté"); std::cout << std::endl;
std::cout << std::endl << std::endl << "Au revoir !" << std::endl << std::endl;
getchar();
return 0;
}
mardi 13 décembre 2011 à 12:44:24 | Re : Afficher les caractères accentués sous Windows en mode console

CptPingu

Administrateur CodeS-SourceS
Il est possible de garder le même affichage, mais c'est plus compliqué. Une bonne connaissance de la STL interne est nécessaire :p

Code C/C++ :
#include <iostream>
#include <sstream>
#include <cstring>

struct SetOEM
{
  SetOEM(const char* s)
    : _oem(s)
  {
  }
  const char* _oem;
};

inline SetOEM
OEM(const char* s)
{
  return SetOEM(s);
}

template <class charT, class traits>
std::basic_ostream<charT, traits>&
operator<<(std::basic_ostream<charT, traits>& out, SetOEM oem)
{
  char* s;
  s = new char[strlen(oem._oem) + 1];
  strcpy(s, oem._oem); //Remplace par CharToOem(oem, s);
  out << s;
  delete [] s;
  return out;
}

int main ()
{
  char caf[] = "Les caractères français doivent être convertis";
  std::cout << std::endl
            << OEM("Démo de ca() n° 1 : ")
            << OEM(caf)
            << std::endl
            << OEM("Démo de ca() n° 2 : ")
            << OEM("Noëlle aperçut là-bas l'âne bâté")
            << std::endl
            << std::endl << std::endl
            << "Au revoir !" << std::endl
            << std::endl;
  //getchar();
  return 0;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mardi 13 décembre 2011 à 13:39:14 | Re : Afficher les caractères accentués sous Windows en mode console

CptPingu

Administrateur CodeS-SourceS
Simplifions un petit peu :)

Code C/C++ :
#include <iostream>
#include <sstream>
#include <cstring>

struct SetOEM
{
  SetOEM(const char* s)
    : _s(s)
  {
  }
  const char* _s;
};

inline SetOEM
OEM(const char* s)
{
  return s;
}

std::ostream&
operator<<(std::ostream& out, const SetOEM& oem)
{
  char* s = new char[strlen(oem._s) + 1];
  strcpy(s, oem._s); //CharToOem(oem._s, s);
  out << s;
  delete [] s;
  return out;
}

int main ()
{
  char caf[] = "Les caractères français doivent être convertis";
  std::cout << std::endl
            << OEM("Démo de ca() n° 1 : ")
            << OEM(caf)
            << std::endl
            << OEM("Démo de ca() n° 2 : ")
            << OEM("Noëlle aperçut là-bas l'âne bâté")
            << std::endl
            << std::endl << std::endl
            << "Au revoir !" << std::endl
            << std::endl;
  //getchar();
  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
mardi 13 décembre 2011 à 13:58:56 | Re : Afficher les caractères accentués sous Windows en mode console

pgl10

CptPingu,

Formidable ! C'est exactement ce que je souhaitais ! Je vais m'efforcer de bien comprendre le fonctionnement cette solution. Je viens de vérifier que cela marche très bien même avec mon vieux Visual C++ 6.0 Alors je dis : bravo et merci. Logiquement, cela vaudrait d'être bien ou mieux connu. Il n'y a plus de fuite mémoire et l'utilisation est bien ce qui est souhaitable. Il y a sûrement beaucoup de visiteurs qui seront heureux de le noter, même si cela ne concerne que les programmeurs sous Windows en mode console. pgl10
mercredi 14 décembre 2011 à 05:57:55 | Re : Afficher les caractères accentués sous Windows en mode console

Lucky92

Bonjour,

J'évite comme la peste les chaînes accentuées. Mais lorsque je n'ai pas le choix, j'utilise la snippet suivante :

Code C/C++ :
#include <iostream>
#include <clocale>

int main (int argc, char* argv[])
{
	setlocale( LC_CTYPE , "fra" ) ;
	std::cout << "Noëlle aperçut là-bas l'âne bâté"" << std::endl ;
}


Ce code à l'avantage d'être concis et ne dépend pas de "windows.h".
En revanche, sous windows xp, ce code ne fonctionnait pas toujours : il semblait dépendre de la police de caractères affectée à la console. Sous windows 7, ça semble fonctionner correctement.

Qu'en pensez-vous ?

@++
mercredi 14 décembre 2011 à 10:44:03 | Re : Afficher les caractères accentués sous Windows en mode console

pgl10

Merci Lucky92.
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.


Cette discussion est classée dans : char, caractères, std, endl, oem


Répondre à ce message

Sujets en rapport avec ce message

Comment faire des tableaux de chaines de caractères ? [ par ProGamer ] Je veux faire des tableaux de chaines de caractères I want to make arrays of strings, mais en utilisant seulement le type de base, char.J'ai essayé ce Comment faire des tableaux de chaines de caractères ? [ par ProGamer ] Je veux faire des tableaux de chaines de caractères I want to make arrays of strings, mais en utilisant seulement le type de base, char.J'ai essayé ce passage de chaines de caractères en paramètre d'une DLL C vers VB [ par jopop ] Salut tous les coders,soyons brefs, soyons concis.ma fonction :extern "C" void __stdcallMakeLineEx(const char* folder,char* file,char* sout); - folder travail avec des chaines de caractères [ par felisk ] char a[]="abcdefg abcdefg";char b[]="123456789"char c[30];sscanf(a, "%10c", c); /*je veux copier 10 caractères de a vers c pour obtenir b="abcdefg ab" chaine de caractères.... [ par Clonk ] Bonjour,Voilà, j'ai un problème depuis hier sur uen histoire de chaine de caractères... je sais que c'est une erreur bête, mais je n'arrive pas à trou Fusionner d'une chaine de caractères [ par kiboumz ] Bonjour, j'aimerais savoir comment faire pour fusionner deux chaines de caractères ensemble Ex char Allo; char Bonjour; char Ensemble; Allo = "allo remplissage d'un std::list [ par boun85 ] Voila mon probleme est assez simple je pense mais je n'arrive pas a le resoudre. Voila j'ai une fonction qui lit un fichier et qui rempli une std::lis D'une AnsiString à un Tableau de char [ par sevenace ] Bonjour à tous, Mon AnsiString provient d'un EditBox. Je récupère le nombre de caractères comme ça:     AnsiString chaine = EditChaine->Text;     i surcharge << [ par koala_corse ] Salut, Je veux surcharger l'opérateur << pour une de mes classes qui encapsule un multimap (donnée membre privée : laListe). Voici le code que j'ai Problème avec C++ 2005 [ par drnicholas001 ] Salut, j'ai une problème avec C++ 2005 express edition. J'ai le code suivant :#include #include #include using namespace std; int main(int argc,


Nos sponsors


Sondage...

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 : 1,451 sec (3)

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