Forum Programmation.c Gestion des accents et caractères bien français !

Posté par  .
Étiquettes : aucune
0
8
mar.
2008
Bonjour,

Je suis en train de réaliser petit programme dans le cadre de mes études. J'aimerai y ajouter la gestion des accents. Je voudrai simplement remplacer les lettres accentuées par leur lettre "normale". Un "é" en "e" si vous préférez.
Mon programme lit dans un fichier des blocs de caractères. Je traite ensuites ces blocs caractères par caractères. Mais les lettres accentuées ne sont pas reconnues


if (lettre == 'é')
{
lettre = 'e';
}

ne fonctionne pas.

Merci de votre aide.
  • # re

    Posté par  (site web personnel) . Évalué à 1.

    c'est pas strcpy l'assignation de char ?
  • # Encodage

    Posté par  (site web personnel) . Évalué à 2.

    Il y a plusieurs façons d'encoder une lettre. Si cela ne fonctionne pas pour toi, c'est que l'encodage d'un caractère dans ton code n'est pas le même que dans tes chaînes de caractères.

    En C, lorsqu'on veut manipuler proprement les caractères en prenant en compte leur encodage, on utilise les fonctions wide char comme mbtowc(3) qui convertit une chaine normale (encodée selon la locale) en chaine wide char que tu peux manipuler directement dans ton programme caractère par caractère ou avec les autres fonctions associées.
  • # unsigned char

    Posté par  . Évalué à 2.

    Au minimum, il fait que tes caractères soient déclarés 'unsigned char', sinon ils risquent d'être pris pour des 'signés', ce qui pourrait faire perdre du sens à tout caractère au dessus de 127 en code ASCII. Je parle en termes de portabilité sous les Unixes... Sous Linux x86, les 'char' signés perdent effectivement leur sens, 'é' devient '-87'.

    Il est possible aussi que l'internationalisation de ton éditeur de texte ne soit pas dans les mêmes normes que ta ligne de commande ou le mode graphique de ton programme !

    cat Accents.c

    devrait être révélateur : si tu ne vois pas les accents pareils que sous l'éditeur, t'as trouvé une vache de cause de perte de temps.


    Sous Linux :

    $ cat Accents.c

    #include <stdio.h>

    main()
    {
    unsigned char lettre = (unsigned char)'é' ;

    printf("lettre numéro %d\n", (int)lettre) ;

    if (lettre == (unsigned char)'é') {
    printf("Lettre accentuée détectée...\n") ;
    lettre = 'e';
    }

    printf("lettre numéro %d\n", (int)lettre) ;

    return(0) ;
    }

    $ gcc Accents.c
    Accents.c:5:40: attention : constante caractère multi-caractères
    Accents.c:9:31: attention : constante caractère multi-caractères

    $ ./a.out
    lettre numéro 169
    Lettre accentuée détectée...
    lettre numéro 101


    Attention les warnings "constante caractère multi-caractères" devraient être étudiés de près en environnement professionnel. Pour un TP, il y a matière à discuter avec tes profs sur ce vaste sujet de l'internationalisation...

    Après pour aller plus loin, comme déjà signalé, mbrtowc()
    et wcrtomb() et le type wchar_t (wide character), ça c'est le top... Il y a de quoi faire.
    • [^] # Re: unsigned char

      Posté par  (site web personnel) . Évalué à 2.

      Ouai avec un wchar_t ça fonctionne très bien et plus de warnings :


      #include <stdio.h>
      #include <wchar.h>

      main()
      {
      wchar_t lettre = L'é' ;

      printf("lettre numéro %d\n", (int)lettre) ;

      if (lettre == L'é') {
      printf("Lettre accentuée détectée...\n") ;
      lettre = 'e';
      }

      printf("lettre numéro %d\n", (int)lettre) ;

      return(0) ;
      }


      Note : le suffix "L" permet d'indiquer un caractère étendu, le type wchar_t est communément un char avec 31 bits de plus.

      Note 2 : Si tu declares des wchar_t tu dois utiliser les fonctions qui vont avec dans wchar.h
      Exemple :
      strcpy devient wcscpy
      strlen devient wcslen
      etc...


      Je pense que c'est plutôt cette solution que tu dois aborder dans ton programme.
  • # Un petit truc pour la gestion des accents en C

    Posté par  (site web personnel) . Évalué à 3.

    La manière dont ton caractère "é" va être codé dépend de ta locale. Dans certains encodages, cela peut être deux caractères, donc je ne pense pas qu'une comparaison directe fonctionne.

    En fait c'est un peu l'équivalent de g_ascii_strcasecmp de la glib que tu cherches.
    http://library.gnome.org/devel/glib/stable/glib-String-Utili(...)

    J'avais aussi eu des problèmes avec la gestion des accents il y a quelques temps.
    http://blog.freeside.fr/post/2007/03/27/Oisiweb%3A-Comment-a(...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.