IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème accentuation (convertir)


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut Problème accentuation (convertir)
    Bonjour à tous,

    Malgré mes documentations je ne parviens pas à résoudre mon problème, j'importe un source d'une page web ensuite stocké dans un fichier html, celui-ci est ensuite traité dans le but de remplacer les majuscules (pas de soucis) ainsi que les accents (pour pouvoir subir par la suite d'autre traitements) ensuite enregistré dans un fichier texte.

    Le soucis étant que les accents ne sont pas remplacé comme je le désire mais avec les caractères style é...

    Mon fichier html source est codé en UTF8, mon fichier final aussi. J'ai tenté avec un source en UNICODE, en ANSI mais rien ne change.

    Comment résoudre ce problème ?

    (j'utilise Dev C++ pour le cas ou un encodage spécial serait utilisé pour la création de fichier texte)
    Merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Utilises-tu un buffer pour stocker le flux récupérer du site web (requête http GET ?), pour enlever les accents et les majuscules, avant d'écrire le fichier de sortie ? Si non, comment procèdes-tu ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    J'ai oublié de coller l'algo, actuellement j'ouvre mon fichier source, je le traite caractère par caractère puis je stocke le résultat dans un nouveau fichier texte, les majuscules sont bien passé en minuscules mais le problème vient des accents.

    Je n'ai pas mon code sur moi, mais c'est un algo de ce type avec la fonction fgets()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	/* les accentes en Majuscule */
            else if (((lettre=='é')||(lettre=='è'))||((lettre=='ê')||(lettre=='ë'))) {lettre_a_retourner='E';}
            else if (((lettre=='à')||(lettre=='â'))||(lettre=='ä')) {lettre_a_retourner='A';}
            else if (((lettre=='ì')||(lettre=='ï'))||(lettre=='î')) {lettre_a_retourner='I';}
            else if (((lettre=='ô')||(lettre=='ö'))||(lettre=='ò')) {lettre_a_retourner='O';}
            else if (((lettre=='û')||(lettre=='ü'))||(lettre=='ù')) {lettre_a_retourner='U';}
    je souupçonne un soucis d'encodage pourtant tout est en UTF8

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 452
    Par défaut
    Bonjour,

    Si tes données sont en UTF8 et que
    lettre
    est un char C (un "octet" pour simplifier), c'est clair que tu as de problèmes d'encodage.

    En UTF8, un caractère accentué est représenté par plusieurs "octets" (vu par C).

    Ton caractère "ê" par exemple se trouve codé en UTF8 sur deux octets("ê").

    Comme je comprends ton programme, tu prends le "Ã" (premier octet que tu considères comme un caractère) et tu le transcodes puis tu prends "ª" (second octet que tu considères également comme un caractère) et tu le transcodes. Du coup, le texte devient incompréhensible.

    Il faut que tu détecte ce cas (en UTF8, les caractères accentués (en fait tout ce qui est codé au delà de 0x7F) utilise plusieurs octets pour un caractère).

    Regardes http://fr.wikipedia.org/wiki/UTF-8 pour plus de détails.


    Cordialement

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    Merci, j'ai bien compris, cependant j'ai testé avec d'autre format (unicode, ansi) mais rien ne change.

    Pour résoudre ce problème comment dois-je donc m'y prendre ? modifier mes tests et remplacer é par exemple par sa valeur héxa ?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Hello,

    Citation Envoyé par Jérém08 Voir le message
    Le soucis étant que les accents ne sont pas remplacé comme je le désire mais avec les caractères style é...

    Mon fichier html source est codé en UTF8, mon fichier final aussi. J'ai tenté avec un source en UNICODE, en ANSI mais rien ne change.
    Citation Envoyé par Jérém08 Voir le message
    Je n'ai pas mon code sur moi, mais c'est un algo de ce type avec la fonction fgets()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	/* les accentes en Majuscule */
            else if (((lettre=='é')||(lettre=='è'))||((lettre=='ê')||(lettre=='ë'))) {lettre_a_retourner='E';}
            else if (((lettre=='à')||(lettre=='â'))||(lettre=='ä')) {lettre_a_retourner='A';}
            else if (((lettre=='ì')||(lettre=='ï'))||(lettre=='î')) {lettre_a_retourner='I';}
            else if (((lettre=='ô')||(lettre=='ö'))||(lettre=='ò')) {lettre_a_retourner='O';}
            else if (((lettre=='û')||(lettre=='ü'))||(lettre=='ù')) {lettre_a_retourner='U';}
    je souupçonne un soucis d'encodage pourtant tout est en UTF8
    Si tu travailles en UTF-8, tu ne peux pas écrire des choses comme « lettre=='é' » si lettre est un char ordinaire puisqu'en UTF-8, chaque caractère peut être codé sur un à quatre octets. C'est l'inconvénient majeur de ce codage qui a beaucoup d'avantages par ailleurs : tu brises la relation « 1 octet = 1 caractère » et ça devient très pénible pour calculer à l'avance la taille d'un buffer.

    Et encore, nous travaillons avec un alphabet latin et la majorité des caractères que nous utilisons se trouve encore dans l'ASCII, mais pour les gens qui écrivent en cyrillique ou en chinois, à moins de changer de page par défaut, tu obtiens des pages qui doublent voire triplent de volume en moyenne.

    Il faut utiliser les wchar et toutes les fonctions associées, définies avec C99. Il faut aussi utiliser setlocale() pour choisir le bon mode au départ. Même avec des paramètres par défaut en variable d'environnement, on a parfois des surprises.

    Edit : grillé par acaumes le temps de finaliser mon commentaire…

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    Je vais utiliser cette méthode uniquement pour ma fonction donc si je comprend bien,
    -j'importe <wchar.h> et <locale.h>
    -je définis setlocale (LC_CTYPE, "");
    -je passe mon caractere en type wchar_t

    je test et je vous tiens au courant, merci en tout cas

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    Après reprise de tuto et de code source pour tester, ça ne fonctionne pas, existe t-il une bibliothèque me permettant de supprimer ces accents (pas les lire)? ou le problème est universel

  9. #9
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par Jérém08 Voir le message
    Après reprise de tuto et de code source pour tester, ça ne fonctionne pas, existe t-il une bibliothèque me permettant de supprimer ces accents (pas les lire)? ou le problème est universel
    Bonjour,

    on arrive facilement à s'arracher les cheveux quand on patauge dans les problèmes d'encodage
    Si je comprends tu as une source en UTF8 ainsi qu'une sortie en UTF8. Le plus simple pour toi est donc que toute ta chaîne soit en UTF8 (est-ce le cas de ton éditeur ? quels outils utilises-tu ? sur quelle plateforme ?).

    La glibc propose des fonctions de transcodages, tout comme le bibliothèque iconv ou ou GLib-2, il y a la grosse artillerie comme ICU ...

    Sinon si tu désires le faire «à la main», il y a toujours la solution de considérer ton «char *» comme une suite de byte non signés :
    le glyphe `é` sera encodé par deux octets [C3] [A9].

    Je suppose que comme ton compilateur n'émet aucun warning sur du code comme lettre=='é' (ou as-tu des warnings ????) tu ne travailles pas avec un éditeur en UTF8.

    Remarque: si tu vois é à la place de é c'est que l'outil que tu utilises pour visualiser ton fichier crois qu'il a à faire à de l'ISO8859 alors qu'en fait c'est de l'utf8 ... Il ne faut pas non plus oublier de configurer les outils que tu utilises pour vérifier le contenu.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    Bonjour,

    effectivement mon entrée et mon source sont en UTF8 (bien que j'ai fais des tests avec d'autres formats mais la création de fichier se fait en UTF8 sous DevC++ avec windows.

    Utilisant déjà plusieurs bibli, je préférerai ne pas en rajouter de trop et du coup préfère la méthode manuelle si possible, je ne vois juste pas comment m'y prendre.

    Sinon effectivement mon é se transforme en é

  11. #11
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par Jérém08 Voir le message
    Bonjour,

    effectivement mon entrée et mon source sont en UTF8 (bien que j'ai fais des tests avec d'autres formats mais la création de fichier se fait en UTF8 sous DevC++ avec windows.

    Utilisant déjà plusieurs bibli, je préférerai ne pas en rajouter de trop et du coup préfère la méthode manuelle si possible, je ne vois juste pas comment m'y prendre.

    Sinon effectivement mon é se transforme en é
    Bonjour,

    bah pour le é il suffit de remplacer toutes les occurences de deux octets consécutifs [0xC3][0xA9] pour un seul octet [0x65].

    D'une manière plus générique, tu peux aller sur http://www.utf8-chartable.de/unicode-utf8-table.pl par exemple, afficher le bloc Latin-1 supplément qui te donnera un tableau du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    U+00E0	à	c3 a0	LATIN SMALL LETTER A WITH GRAVE
    U+00E1	á	c3 a1	LATIN SMALL LETTER A WITH ACUTE
    U+00E2	â	c3 a2	LATIN SMALL LETTER A WITH CIRCUMFLEX
    U+00E3	ã	c3 a3	LATIN SMALL LETTER A WITH TILDE
    U+00E4	ä	c3 a4	LATIN SMALL LETTER A WITH DIAERESIS
    U+00E5	å	c3 a5	LATIN SMALL LETTER A WITH RING ABOVE
    cela te permet de répérer les codes des glyphes que tu veux remplacer.


    Remarque:

    Attention, pour demander un é il y a deux moyens en unicode : (version utf8 pour les codes)
    insérer le caractère = [C3][A9] =
    insérer le signe «accent aigu» que tu compose avec la lettre e = [CC][81] (='combinant) [65] (=e)

    mais cela n'est pas très utilisé, dans ce cas il suffit de ne pas reprendre les octets du signe combinant (regarde le bloc combining diacritical mark).

    Remarque 2: Je passe le fait qu'on puisse insérer des codes directement en html ...



    ------

    Je suppose que comme tu parles d'accents, il s'agit d'un projet traitant des pages francophones ... que fais-tu des cédilles et des ligatures ?
    S'il s'agit de pages plus internationales il faudra penser à utiliser une fonction du genre
    <FICHIER EN UTF8> ---transcodage en US-ASCII 7bit---> <FICHIER «sans accents»> ---transcodage en UTF8---> <FICHIER «sans accents» en UTF8>

  12. #12
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Le problème a été réglé comment ? Il m'intéresse !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  13. #13
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 789
    Par défaut
    Hello,

    Personnellement, j'avais utlisé cette solution, qui fonctionnait avec le fichier que j'avais, mais j'ignore si c'est la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /* Convertit un string codé en utf-8 en unicode	(Latin uniquement)												*/
    /* Retour: l'adresse du string de destination  																	*/
    char *cvt2unicode(char *strout,char *strin)
    {
    	unsigned char *s=strin;
    	unsigned char *t=strout;
     
    	while(*s) {
    		if(*s==0xc3) {	// Unicode trouvé
    			int offset=*++s-0x80;
    			if(offset>=0 && offset<sizeof(utf8_2_unicode)/sizeof(utf8_2_unicode[0])) *t=utf8_2_unicode[offset];
    			else *t='?';
    			}
    		else *t=*s;
    		t++; s++;
    		}
    	*t=0;
    	return(strout);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /* Note: match is utf-8 minus 0x80 for utf-8 point 0xc3 */
    static unsigned char utf8_2_unicode[]={
    0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
    0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
    0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
    0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc};
    Edit: attention: cela convertit uniquement, mais ne met pas en majuscule!

  14. #14
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut


    Quelles sont les lettres converties ?
    Tous ça : ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿÑñ ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  15. #15
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 789
    Par défaut
    Non, cela ne convretit pas les Å ý ÿ Ñ ñ ð et les caractères avec ~

  16. #16
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Je donne le code que j'ai finalement fait. J'ai converti du code que j'avais fait en php.

    Mon but est de comparer deux chaînes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    /* définition facile à regarder de la conversion */
    const gchar * accent     ="ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿÑñ";
    const gchar * sans_accent="AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyyNn";
     
     
    signed char compare_sans_casse(char * s1,char * s2)
    {
        char c1=0,c2=0;
        unsigned short i;
     
        if ((s1==NULL || *s1==0) && (s2==NULL || *s2==0)) return 0;
        if (s1==NULL || *s1==0) return -1;
        if (s2==NULL || *s2==0) return  1;
        s1--;
        s2--;
        do
        {
          s1++;
          s2++;
          if (*s1==-61 && *(s1+1)!=0)
          {
    	s1++;
    	c1=toupper(*s1); /* éviter un retour comment le précédent */
    	for(i=0;sans_accent[i]!=0;i++)
    	  if (*s1==accent[2*i+1])
    	    c1=toupper(sans_accent[i]);
          }
          else
    	c1=toupper(*s1);
     
          if (*s2==-61 && *(s2+1)!=0)
          {
    	s2++;
    	c2=toupper(*s2);
    	for(i=0;sans_accent[i]!=0;i++)
    	  if (*s2==accent[2*i+1])
    	    c2=toupper(sans_accent[i]);
          }
          else
    	c2=toupper(*s2);
     
        }
        while(*s1!=0 && *s2!=0 && c1==c2);
     
        if (*s1==0 && *s2==0)
            return 0;
        if (*s1==0)
            return -1;
        if (*s2==0)
            return 1;
        return c1-c2;
    }
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

Discussions similaires

  1. Réponses: 26
    Dernier message: 03/11/2008, 16h29
  2. [SQL2K] Problème pour convertir un timestamp en datetime !!
    Par MeHo_ dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/03/2008, 11h02
  3. [MySQL] Tout en UTF8 mais problème accentuations quand même
    Par speedev dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 11/04/2007, 22h43
  4. Réponses: 11
    Dernier message: 19/02/2007, 00h20
  5. [C#] Problème pour convertir .Color en .Brush
    Par pymouse dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/05/2005, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo