Partage
  • Partager sur Facebook
  • Partager sur Twitter

traité les accents en mode console

recherche une autre façon de faire

9 novembre 2009 à 10:00:37

Bonjours a tous,

Qui n'as jamais été confronté au accents dans une phrase affiché en mode console, et à la surprise général il ne s'affiche pas autrement que par des signes bizare.....

J'ai fait un travail là dessus et je propose le code ci-dessous, pour en venir a bout.

Cependant je solicite votre aide pour traité le sujet d'une manière moins lourde et sans passé ci-possible par une fonction.

D'avance merci

voici mon code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define UTF-8


   char chaine1 [100] = "chaîne défini statiquement.  elle était bleuté ",
           chaine2 []     = "chaîne défini statiquement mais sans connaître exactement la taille de celle-ci, et sans perdre de place",
          *chaine3       = NULL;


void Affiche_chaines ( const char *message);

void retrouve_code (char c1);

char *convertion_accent (const char *ch);

char *recherche_modifi_fin ( char*chaine_debut, char recherche, const char *chaine_fin );



/********************************************************/
/********************************************************/
int main()
{
   char *c = NULL; // chaine de travail
   chaine3 = "chaine dynamique : l'eau du lac, était très calme ";
   Affiche_chaines ( convertion_accent ("--- Chargement des chaines de caractères ---"));

/*------------- gestion des accents et affichage -----------------------*/

   printf ("\n--- Traitement des accents ----\n");
   c= convertion_accent (chaine1);
   printf ("%s\n",c);
   strcpy ( chaine1, c); // recopie de la nouvelle chaine dans la chaine1
   free (c);

   // meme chose que ci dessus mais de façons plus rapide
   strcpy ( chaine2, convertion_accent (chaine2)); // recopie dans la chaine 2 la chaine converti avec les accents
   printf ("%s\n", chaine2) ;

   // notez que pour les chaines 1 et 2 on est obligé de passer par le recopiage des chaines alors que pour la chaines 3 non
   printf ("%s\n", (chaine3 = convertion_accent (chaine3))) ;// traitement expeditif de la chaine 3

   Affiche_chaines (convertion_accent ("--- Traitement des accents après avoir changé la copie des chaînes statiques ----"));

/*------------------ recherche et remplace -----------------------------*/

   chaine3 = recherche_modifi_fin (chaine3,':',chaine2);
   Affiche_chaines (convertion_accent ("--- Recherche un caractère et remplace la fin, le tout mis dans la chaîne 3 ---"));

/*------------------- Liberation de la mémoire -------------------------*/
   free (chaine3);
   chaine3 = NULL;
   Affiche_chaines (convertion_accent ("---- Aprés la libèration de la mémoire ----"));

/*------------------- fin ----------------------------------------------*/
return 0;
}


/********************************************************/
/********************************************************/
void Affiche_chaines
         ( const char *message){
/*----------------------------------------------------------------------*/
   if ( message != NULL )
         printf ("\n%s\n\n",message );
   printf ("chaine 1 : %s \n",chaine1);
   printf ("chaine 2 : %s \n",chaine2);
   printf ("chaine 3 : %s \n\n",chaine3);
//*/
}


/********************************************************/
/********************************************************/
char *convertion_accent
         (const char *ch) {

      int i, j ;
      char *ch2 = NULL;
/*----------------------------------------------------------------------*/
#ifdef UTF-8

      j = 0; i = 0;
      ch2 = malloc (sizeof (char[strlen(ch)+1] ));

      while ( ch[i] !=0 ) {
         if ( ch[i] == -61)  // caractère spéciaux rechercher
         {
            i++;
            switch ( ch[i] )
            {
               case -87 : // é
                  ch2[j] = 130;
                  break;
               case -88 : // è
                  ch2[j] = 138;
                  break;
               case -96 : // à
                  ch2[j] = 133;
                  break;
                case -82 : // î
                  ch2[j] = 140;
                  break;
                case -89 : // ç
                  ch2[j] = 135;
                  break;
                case -76 : // ô
                  ch2[j] = 147;
                  break;
               default :
                  break ;
            }
         }
         else
            ch2[j] = ch[i] ;
         j++;
         i++;
      }
      ch2[j] = 0;
#endif
//*/
return ch2;
}

/********************************************************/
/********************************************************/
void retrouve_code
         (char c1){
/*----------------------------------------------------------------------*/
   unsigned char c2;

   printf ("%c %d\n",c1,c1); // prechons le faux code !

   printf ("? -> %c %d",(c2=getchar ()),c2);// retrouvons le bon code !
//*/
}


/********************************************************/
/********************************************************/
char *recherche_modifi_fin
            ( char*chaine_debut, char recherche, const char *chaine_fin ){
/*----------------------------------------------------------------------*/
   int     lc2 = strlen (chaine_fin);
   char *t= strrchr(chaine_debut,recherche);
   int index = t-chaine_debut;
   int i,j;

   if ( t == NULL) return chaine_fin;

   t = malloc (sizeof (char[index+lc2+1])) ;

   // on recopie la premiere partie de la chaine du debut
   for (i = 0; i<index; i++){
      t[i] = chaine_debut[i] ;
   }
   // on remplace a partir de la position de recherche
   for (j = 0; j<lc2; j++) {
      t[i+j]= chaine_fin[j];
   }
   // termine la chaine;
   t[i+j]= 0;

return t;
//*/
}


Bon je me suis amuser avec les chaine de caractere et etudier aussi certain points qui m'ont posé des problemes , maintenant résolus
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2009 à 17:24:10

Salut moi j'utilise un truc très simple : c'est 4 ou 5 caractères en plus.

C'est dans un printf, à la place de la lettre accentuée, je mets \xnuméro.

ex :



printf("Salut pépé ! Ca va ? Tu sais ce que j'ai eu a Noel ?");
printf("Salut p\x82p\x82 ! \x80a va ? Tu sais ce que j'ai eu \x85 No\x89l ?");

printf("\x87 \x8A \x8B \x8C \x90 \x96 \x97");


Salut pùpù ! Ca va ? Tu sais ce que j'ai eu a Noel ?
Salut pépé ! Ça va ? Tu sais ce que j'ai eu à Noël ?

ç è ï ï É û ù


D'autres permettent d'afficher des signes mathématique (racine carré, ...etc) ou des symboles.

Voilà @+
  • Partager sur Facebook
  • Partager sur Twitter
Créateur d'un Real Time Strategy en C++.
9 novembre 2009 à 17:45:04

Vous vous faites vraiment chier pour rien les mecs...

Il suffit juste de taper par exemple : printf("La chose qui va suivre est bien un accent, %c", 130);
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2009 à 17:49:11

La premiere est la mieux je pense :)
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2009 à 18:32:15

A ok

c'est clair que c'est plus simple, mais bon mémoriser ses chiffres comme sa c pas très pratique

Merci pour ces infos


je vais voir si je ne peut faire un #define là dessus sa serait nettement plus simple.

Je vous tient au courant et posterais si j'ai reussi


  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2009 à 18:41:10

Je te donne ce tableau pour les deux techniques.

1<math>\(^e^r^e\)</math> colone : technique de Hylian
2<math>\(^e^m^e\)</math> colone : ma technique

Image utilisateur
  • Partager sur Facebook
  • Partager sur Twitter
Créateur d'un Real Time Strategy en C++.
9 novembre 2009 à 18:51:52

oui c la deuxieme partie du tableau ASCII
celle qui fait defaut parce que un caractere devient negatif et donc on a pas acces a du positif ^^

c la le probleme,

Ce que je cherche a faire c de remplacer les caractères défectueux de façons automatique sans passé par une fonctions.

Je ne sais pas si vous voyez le problème.
Je voudais c'est écrire mon message avec des "é" ou "è" sans m'occuper du code '\x80' (par exemple)
mais que ça se rajoute juste avant la compilation, et donc je veux passer par un #define.

J'ai pas trop le temps de voir sa ce soir, je verrais cela demain
merci :D

  • Partager sur Facebook
  • Partager sur Twitter
16 juin 2019 à 23:35:13

@Joystic9 s'il te plait, où trouves - tu ces ASCII négatifs ??

  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2019 à 4:31:08

Bonjour, Joystic9 ne s'est plus connecté depuis 2010!!

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter