Bonjour,
Cet article peut être considéré comme un complément du snipet "Afficher des caractères spéciaux(accents, ...)", déposé par capoueidiablo en 2011 (lien ci-dessous).
Les 5 fonctions présentées ici transforment un texte ANSI en OEM pour l'afficher le mieux possible sur la console.
Le tableau
unsigned char cod[128] n'est utilisé qu'avec les caractères ANSI de 128 à 255.
const unsigned char Imp='?'; // Impossible
unsigned char cod[128]=
{Imp,Imp,Imp,159,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp
,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp,Imp
,255,173,189,156,207,190,221,245,249,184,166,174,170,240,169,238
,248,241,253,252,239,230,244,250,247,251,167,175,172,171,243,168
,183,181,182,199,142,143,146,128,212,144,210,211,222,214,215,216
,209,165,227,224,226,229,153,158,157,235,233,234,154,237,232,225
,133,160,131,198,132,134,145,135,138,130,136,137,141,161,140,139
,208,164,149,162,147,228,148,246,155,151,163,150,129,236,231,152};
Certains caractères sont impossible à traduire, car ils n'ont pas de représentant en OEM: ils sont remplacés par
Imp (ici '?').
Les 5 routines qui suivent utilisent le tableau
unsigned char cod[128].
Choisissez celle qui vous convient le mieux.
ToOEM(char txt[])
Le texte
txt[] est transformé sur lui-même:
char *ToOEM(char txt[]) { // txt modified
int n = strlen(txt);
for (int i = 0; i < n; ++i) if (txt[i]<0) txt[i] = cod[127&txt[i]];
return txt;
}
// Utilisations:
char txt[]="Raphaël, Éric, Aloïs et Benoît";
printf("%s",txt); // mauvais affichage
printf("%s",ToOEM(txt)); // txt est transformé sur lui-même
Comme
txt[] doit être (une) variable, on ne peut pas écrire
printf("%s",ToOEM("Interdit")); !
ToOEMfix(const char txt[])
On peut réserver un array de caractères de longueur donné et y copier le texte traduit:
const int MaxLen = 256;
char txtFix[MaxLen+1];
char *ToOEMfix(const char txt[]) {
int n = strlen(txt);
if (n > MaxLen) n = MaxLen;
for (int i = 0; i < n; ++i) txtFix[i] = (txt[i]>=0) ? txt[i] : cod[127&txt[i]];
txtFix[n] = 0;
return txtFix;
}
// Utilisation:
printf("%s",ToOEMfix("De Genève à Düsseldorf à vélo"));
Un text trop long sera tronqué à
MaxLen.
ToOEMnew(const char txt[])
Une autre possibilté est de copier le texte traduit dans un nouveau texte:
char *ToOEMnew(const char txt[]) { // txt no modified
int n = strlen(txt);
char *t = new char[n+1];
for (int i = 0; i <=n; ++i) t[i] =(txt[i]>=0) ? txt[i] : cod[127&txt[i]];
return t;
}
// Utilisations:
printf("%s", ToOEMnew("Mémoire non libérée"));
char *lib = ToOEMnew("Mémoire libérée");
printf("%s", lib);
delete lib;
ToOEMcpy(const char txt[])
Utilisons un unique pointeur
oem pour faire directement la gestion de la mémoire:
char *oem = 0;
char *ToOEMcpy(const char txt[]) {
int n = strlen(txt);
if (oem) delete oem;
oem=new char[n+1];
for (int i = 0; i <= n; ++i) oem[i] = (txt[i] >= 0) ? txt[i] : cod[127&txt[i]];
return oem;
}
// Utilisation:
printf("%s", ToOEMcpy("Hétérogénéité des élèves"));
ToOEMext(const char txt[])
Simplifions la gestion de la mémoire en intervenant seulement lorsqu'on a besoin de l'augmenter:
char *ext = new char[1];
char *ToOEMext(const char txt[]) {
unsigned int n = strlen(txt);
if (n >= sizeof(ext)) {delete ext; ext = new char[n+1];}
for (unsigned int i = 0; i <= n; ++i) ext[i] = (txt[i] >= 0) ? txt[i] : cod[127&txt[i]];
return ext;
}
// Utilisation:
printf("%s", ToOEMext("De Genève à Düsseldorf à vélo"));
Remarque: Pour les 5 routines, lorsque le texte à afficher ne comporte pas de caractères interprétés par le format (tels que '%', '', ...), on peut simplifier le code d'utilisation. Par exemple:
printf("%s",ToOEMfix("De Genève à Düsseldorf à vélo"));
peut directement s'écrire:
printf(ToOEMfix("De Genève à Düsseldorf à vélo"));
Le
zip contient le fichier
Console.cpp qui génère l'output représenté par l'image de capture.
Voir aussi:
Afficher des caractères spéciaux(accents, ...)
Table des codes ASCII étendus OEM et ANSI
Bonne lecture ...
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.