Accents sur la Console

Description

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

Codes Sources

A voir également

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.