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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 37
    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 480
    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 480
    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 edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    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!

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

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

    Informations professionnelles :
    Activité : Développeur informatique

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

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