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 :

Afficher en respectant l'encodage local


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut Afficher en respectant l'encodage local
    Bonjour,

    je dois réaliser une application qui fonctionne sur plusieurs machines linux avec des encodages différents par défaut (dans la console notament), (principalement latin-1 et UTF-8). Mon problème est que pour afficher des accents, la console doit être dans le même encodage que le fichier source (.c) sinon ça ne marche pas, j'ai soit un ? soit des caractères byzarres. J'ai beau essayer de spécifier l'encodage locale avec setlocale(), ça ne marche pas, je dois mal m'y prendre.

    Est ce que quelqu'un peut m'éclairer sur ce problème ?

    Merci d'avance.
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    setenv et getenv ?? (en précisant le LOCALE comme paramètre)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Généralement, un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocale (LC_ALL, "");
    en début de code suffit.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Bonjour,

    j'ai bien essayé le setlocale(LC_ALL, ""), mais déjà je ne sais pas exactement où le mettre : dans le main ? dans la fonction d'affichage juste avant printf (qui se trouve dans un autre fichier source) ?

    Sinon pour le setenv, je comprends à quoi ça sert mais je ne vois pas l'utilité ici, une petite explication ?

    Je vais refaire des tests dans la matinée et je vous post le code qui ne marche pas.

    A tout à l'heure
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  5. #5
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Le Mérovingien Voir le message
    Bonjour,

    j'ai bien essayé le setlocale(LC_ALL, ""), mais déjà je ne sais pas exactement où le mettre : dans le main ? dans la fonction d'affichage juste avant printf (qui se trouve dans un autre fichier source) ?
    Généralement, on le place comme première instruction dans le main().
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Généralement, un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocale (LC_ALL, "");
    en début de code suffit.
    Ca va changer la locale mais pas l'encodage. Si par exemple mon source est encodé en ISO-8859-1 et que je cherche à afficher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <stdlib.h>
    #include <locale.h>
     
    int main(void)
    {
        setlocale(LC_ALL, "");
     
        printf("ééé");
        return 0;
    }
    dans une console dont l'encodage est en UTF-8. Je vais avoir des surprises. Voir convertir d'un encodage à un autre, Pour du côté de libiconv ou de la Glib.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Alors voilà un code qui ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    #include <locale.h>
     
    int main(void)
    {
      char *locale = setlocale(LC_ALL, "");
     
      printf("locale actuelle : %s\n\n",locale);
     
      printf("Voici des éléments à afficher après sélection de l'encodage.\n");
     
      return 0;
    }
    Ce fichier est enregistré en encodage latin-1 (avec emacs), compilé et exécuté dans une console encodé en UTF-8 (je suis sous ubuntu avec l'encodage par défaut), et j'obtiens des ? dans un carré noir (comme quand on force l'encodage de cette page en UTF-8).

    Je viens de lire le message de Thierry Chappuis et c'est ça qu'il me faut, je regarde et je vous dis quoi
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Et bien, ça me parait bien compliqué tout ça, j'ai regardé le man de iconv, je comprends pas tout et ça à l'air lourd à utiliser. Du coté de la glib, je n'ai pas trouvé les fonctions de convertion, est ce que quelqu'un pourrait me passer le lien vers la doc, ou juste le nom des fonctions (je n'y connais rien à la glib, je ne l'ai jamais utilisée) ? Sinon, j'ai pensé à une autre méthode : peut-on changer temporairement l'encodage de la console, plutôt que celui de la sortie du programme ?

    D'autre part, j'ai un autre problème (qui est lié je vous rassure) : je reccupère un texte à partir d'un fichier que je mets dans un buffer, puis je voudrais en extraire les mots. Pour celà j'utilise les fonctions de ctype.h : isalnum, ispunct etc, mais le problème, c'est que par défaut, les caractères accentuées ne sont pas considérés comme des caractères alpha-numériques (et donc rejetés par isalnum). J'ai lu qu'il fallait là encore changer le locale, mais ça ne marche pas non plus . Puis-je abuser encore un peu de votre savoir ?
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Ce code fait le job, pour autant que ton fichier source soit encodé en UTF-8:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <glib.h>
    #include <locale.h>
     
    int main(void)
    {
        gchar s[] = "ééé";
        gchar *new_s;
        int ret = 0;
     
        setlocale(LC_ALL, "");
     
        new_s = g_locale_from_utf8(s, -1, NULL, NULL, NULL);
        if (new_s != NULL)
        {
            printf("%s\n", new_s);
            g_free(new_s), new_s = NULL;
        }
        else
        {
            ret = EXIT_FAILURE;
        }
     
        return ret;
    }
    L'affichage est OK, quel que soit l'encodage de la console (pour autant que la variable d'environnement LANG indique la bonne locale).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Même si je préfère de loin la méthode de Thierry, si tu tiens absolument à rester en ISO-8859-1, tu peux utiliser la fonction g_convert() coupler à g_get_charset().
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  11. #11
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Merci pour ces dernières réponses, je crois que ça va marcher. J'aime bien la méthode de Thierry mais malheureusement je dois rester en iso-8859-1 pour l'encodage de mes fichiers sources (les ordi de mon école gèrent TRES mal l'utf-8, no comment :d ). Je vais donc utiliser g_convert() et g_get_charset(). En plus j'ai trouvé la page de man de la glib : http://library.gnome.org/devel/glib/...onversion.html , ça va aider.

    Sinon, pour les isalnum qui ne reconnaissent pas les accents, je suis toujours bloqué...

    Merci en tout cas, déjà la moitié du problème de résolu
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Même si je préfère de loin la méthode de Thierry, si tu tiens absolument à rester en ISO-8859-1, tu peux utiliser la fonction g_convert() coupler à g_get_charset().
    Oui, g_locale_from_utf8() n'est rien d'autre qu'un raccourci qui utilise les fonctions que tu cites. Si l'encodage du fichier source est différent de UTF8, c'est bien ces deux fonctions qu'il faut utiliser.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  13. #13
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Le Mérovingien Voir le message
    Merci pour ces dernières réponses, je crois que ça va marcher. J'aime bien la méthode de Thierry mais malheureusement je dois rester en iso-8859-1 pour l'encodage de mes fichiers sources (les ordi de mon école gèrent TRES mal l'utf-8, no comment :d ). Je vais donc utiliser g_convert() et g_get_charset(). En plus j'ai trouvé la page de man de la glib : http://library.gnome.org/devel/glib/...onversion.html , ça va aider.

    Sinon, pour les isalnum qui ne reconnaissent pas les accents, je suis toujours bloqué...

    Merci en tout cas, déjà la moitié du problème de résolu
    Voici un exemple avec les fonction g_get_charset() et g_convert() pour un fichier source encodé en ISO-8859-1:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <glib.h>
    #include <locale.h>
     
    int main(void)
    {
        gchar s[] = "ééé";
        const gchar *to_charset;
        gchar *new_s;
        int ret = 0;
     
        setlocale(LC_ALL, "");
     
        if (g_get_charset(&to_charset))
        {
            new_s = g_convert(s, -1, to_charset, "ISO-8859-1", NULL, NULL, NULL);
            if (new_s != NULL)
            {
                printf("%s\n", new_s);
                g_free(new_s), new_s = NULL;
            }
            else
            {
                ret = EXIT_FAILURE;
            }
        }
        else
        {
            ret = EXIT_FAILURE;
        }
     
        return ret;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  14. #14
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Bonjour !

    Désolé pour ce long silence, j'ai été pris par un autre projet et je n'ai pas pu tester correctement toutes vos solutions, mais maintenant c'est fait, et voilà où j'en suis :

    J'ai implémenté la méthode avec la Glib pour convertir le texte en charset local avant de l'afficher, ça marche nikel. Seul (petit) défaut : il semblerait que la fonction g_get_charset provoque une fuite de mémoire, détectée par valgrind en tout cas...

    Pour mon problème de reconnaissance de caractères accentués avec isalnum, ça marche quand je définis la locale actuelle sur fr_FR.iso-8859-1, seulement cette locale n'est pas acceptée par ubuntu (qui refuse de la changer donc), y'a t'il quelque chose de spécial à faire sous ubuntu ?

    Merci en tout cas pour vos réponses qui se sont avérées très utiles juqsu'ici.
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  15. #15
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Le Mérovingien Voir le message
    Bonjour !

    Désolé pour ce long silence, j'ai été pris par un autre projet et je n'ai pas pu tester correctement toutes vos solutions, mais maintenant c'est fait, et voilà où j'en suis :

    J'ai implémenté la méthode avec la Glib pour convertir le texte en charset local avant de l'afficher, ça marche nikel. Seul (petit) défaut : il semblerait que la fonction g_get_charset provoque une fuite de mémoire, détectée par valgrind en tout cas...

    Pour mon problème de reconnaissance de caractères accentués avec isalnum, ça marche quand je définis la locale actuelle sur fr_FR.iso-8859-1, seulement cette locale n'est pas acceptée par ubuntu (qui refuse de la changer donc), y'a t'il quelque chose de spécial à faire sous ubuntu ?

    Merci en tout cas pour vos réponses qui se sont avérées très utiles juqsu'ici.
    Pourtant la doc de Glib dit que:

    The string returned in charset is not allocated, and should not be freed.
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  16. #16
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    The string returned in charset is not allocated, and should not be freed.
    Oui, c'est ce que j'ai lu aussi. Peut etre que la fuite de mémoire ce trouve ailleurs, mais je ne pense pas à la vue du message de valgrind :

    merovingien@MEROVINGIEN:~/IPI/trunk/src/outils$ valgrind -v --leak-check=full ./test_messages
    ==7003== Memcheck, a memory error detector.
    ==7003== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
    ==7003== Using LibVEX rev 1804, a library for dynamic binary translation.
    ==7003== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
    ==7003== Using valgrind-3.3.0-Debian, a dynamic binary instrumentation framework.
    ==7003== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
    ==7003==
    --7003-- Command line
    --7003-- ./test_messages
    --7003-- Startup, with flags:
    --7003-- --suppressions=/usr/lib/valgrind/debian-libc6-dbg.supp
    --7003-- -v
    --7003-- --leak-check=full
    --7003-- Contents of /proc/version:
    --7003-- Linux version 2.6.24-16-generic (buildd@palmer) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Thu Apr 10 13:23:42 UTC 2008
    --7003-- Arch and hwcaps: X86, x86-sse1-sse2
    --7003-- Page sizes: currently 4096, max supported 4096
    --7003-- Valgrind library directory: /usr/lib/valgrind
    --7003-- Reading syms from /lib/ld-2.7.so (0x4000000)
    --7003-- Reading debug info from /lib/ld-2.7.so...
    --7003-- ... CRC mismatch (computed b93a03d2 wanted 46e85b4d)
    --7003-- object doesn't have a symbol table
    --7003-- Reading syms from /home/merovingien/IPI/trunk/src/outils/test_messages (0x8048000)
    --7003-- Reading syms from /usr/lib/valgrind/x86-linux/memcheck (0x38000000)
    --7003-- object doesn't have a dynamic symbol table
    --7003-- Reading suppressions file: /usr/lib/valgrind/debian-libc6-dbg.supp
    --7003-- Reading suppressions file: /usr/lib/valgrind/default.supp
    --7003-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_core.so (0x401E000)
    --7003-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so (0x4020000)
    --7003-- Reading syms from /usr/lib/libglib-2.0.so.0.1600.3 (0x403C000)
    --7003-- Reading debug info from /usr/lib/libglib-2.0.so.0.1600.3...
    --7003-- ... CRC mismatch (computed d3af26a6 wanted 4d2fc052)
    --7003-- object doesn't have a symbol table
    --7003-- Reading syms from /lib/tls/i686/cmov/libc-2.7.so (0x40ED000)
    --7003-- Reading debug info from /lib/tls/i686/cmov/libc-2.7.so...
    --7003-- ... CRC mismatch (computed 5861e7f6 wanted 741a7509)
    --7003-- object doesn't have a symbol table
    --7003-- Reading syms from /usr/lib/libpcre.so.3.12.1 (0x423D000)
    --7003-- Reading debug info from /usr/lib/libpcre.so.3.12.1...
    --7003-- ... CRC mismatch (computed 49bb7508 wanted 137ea89b)
    --7003-- object doesn't have a symbol table
    --7003-- Reading syms from /lib/libselinux.so.1 (0x4264000)
    --7003-- Reading debug info from /lib/libselinux.so.1...
    --7003-- ... CRC mismatch (computed 14e9a82e wanted 7881f7e5)
    --7003-- object doesn't have a symbol table
    --7003-- Reading syms from /lib/tls/i686/cmov/libdl-2.7.so (0x427D000)
    --7003-- Reading debug info from /lib/tls/i686/cmov/libdl-2.7.so...
    --7003-- ... CRC mismatch (computed fac4a183 wanted 83d3211b)
    --7003-- object doesn't have a symbol table
    --7003-- REDIR: 0x415f620 (rindex) redirected to 0x4023710 (rindex)
    --7003-- REDIR: 0x415ac20 (malloc) redirected to 0x4022a50 (malloc)
    --7003-- REDIR: 0x415c460 (free) redirected to 0x40225f0 (free)
    --7003-- REDIR: 0x41613a0 (strchrnul) redirected to 0x4023df0 (strchrnul)
    --7003-- REDIR: 0x415f250 (strlen) redirected to 0x40239d0 (strlen)
    --7003-- REDIR: 0x41609a0 (memcpy) redirected to 0x4024aa0 (memcpy)
    --7003-- REDIR: 0x4160510 (mempcpy) redirected to 0x4024490 (mempcpy)
    --7003-- REDIR: 0x415c650 (realloc) redirected to 0x4022b10 (realloc)
    --7003-- REDIR: 0x415ffb0 (memchr) redirected to 0x4023bf0 (memchr)
    --7003-- REDIR: 0x415ebb0 (index) redirected to 0x4023800 (index)
    --7003-- REDIR: 0x415ed90 (strcpy) redirected to 0x4024d10 (strcpy)
    --7003-- REDIR: 0x415ed20 (strcmp) redirected to 0x4023aa0 (strcmp)
    --7003-- REDIR: 0x41604b0 (memset) redirected to 0x4023d50 (memset)
    --7003-- REDIR: 0x41612d0 (rawmemchr) redirected to 0x4023e20 (rawmemchr)
    --7003-- REDIR: 0x415f450 (strncmp) redirected to 0x4023a30 (strncmp)
    --7003-- REDIR: 0x415f300 (strnlen) redirected to 0x40239a0 (strnlen)
    --7003-- REDIR: 0x41606a0 (stpcpy) redirected to 0x4024730 (stpcpy)
    --7003-- REDIR: 0x415a930 (calloc) redirected to 0x4021b70 (calloc)
    --7003-- REDIR: 0x415af60 (posix_memalign) redirected to 0x4021b10 (posix_memalign)
    --7003-- Reading syms from /usr/lib/gconv/ISO8859-1.so (0x4038000)
    --7003-- Reading debug info from /usr/lib/gconv/ISO8859-1.so...
    --7003-- ... CRC mismatch (computed 9c15f3ec wanted 8869bb49)
    --7003-- object doesn't have a symbol table
    [21/05/08 - 23:38:42] Erreur : Le message d'erreur numéro 1 !
    [21/05/08 - 23:38:42] Attention : Attention, ça bouge !
    [21/05/08 - 23:38:42] Note : Notez que ça marche...
    --7003-- Discarding syms at 0x4038000-0x403B000 in /usr/lib/gconv/ISO8859-1.so due to munmap()
    ==7003==
    ==7003== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 21 from 1)
    --7003--
    --7003-- supp: 21 dl-hack3-1
    ==7003== malloc/free: in use at exit: 5,128 bytes in 15 blocks.
    ==7003== malloc/free: 1,564 allocs, 1,549 frees, 176,599 bytes allocated.
    ==7003==
    ==7003== searching for pointers to 15 not-freed blocks.
    ==7003== checked 93,284 bytes.
    ==7003==
    ==7003== 744 bytes in 3 blocks are possibly lost in loss record 3 of 5
    ==7003== at 0x4021A92: memalign (vg_replace_malloc.c:460)
    ==7003== by 0x4021B3F: posix_memalign (vg_replace_malloc.c:569)
    ==7003== by 0x4090103: (within /usr/lib/libglib-2.0.so.0.1600.3)
    ==7003== by 0x4091330: g_slice_alloc (in /usr/lib/libglib-2.0.so.0.1600.3)
    ==7003== by 0x404E50E: g_array_sized_new (in /usr/lib/libglib-2.0.so.0.1600.3)
    ==7003== by 0x404E616: g_array_new (in /usr/lib/libglib-2.0.so.0.1600.3)
    ==7003== by 0x409C39F: g_static_private_set (in /usr/lib/libglib-2.0.so.0.1600.3)
    ==7003== by 0x40A2DC0: g_get_charset (in /usr/lib/libglib-2.0.so.0.1600.3)
    ==7003== by 0x8048A88: prepare_chaine (outils_messages.c:158)
    ==7003== by 0x8048780: outils_messages_printErreur (outils_messages.c:65)
    ==7003== by 0x8048B1C: main (test_outils_messages.c:7)
    ==7003==
    ==7003== LEAK SUMMARY:
    ==7003== definitely lost: 0 bytes in 0 blocks.
    ==7003== possibly lost: 744 bytes in 3 blocks.
    ==7003== still reachable: 4,384 bytes in 12 blocks.
    ==7003== suppressed: 0 bytes in 0 blocks.
    ==7003== Reachable blocks (those to which a pointer was found) are not shown.
    ==7003== To see them, rerun with: --leak-check=full --show-reachable=yes
    --7003-- memcheck: sanity checks: 6 cheap, 2 expensive
    --7003-- memcheck: auxmaps: 0 auxmap entries (0k, 0M) in use
    --7003-- memcheck: auxmaps_L1: 0 searches, 0 cmps, ratio 0:10
    --7003-- memcheck: auxmaps_L2: 0 searches, 0 nodes
    --7003-- memcheck: SMs: n_issued = 19 (304k, 0M)
    --7003-- memcheck: SMs: n_deissued = 0 (0k, 0M)
    --7003-- memcheck: SMs: max_noaccess = 65535 (1048560k, 1023M)
    --7003-- memcheck: SMs: max_undefined = 0 (0k, 0M)
    --7003-- memcheck: SMs: max_defined = 49 (784k, 0M)
    --7003-- memcheck: SMs: max_non_DSM = 19 (304k, 0M)
    --7003-- memcheck: max sec V bit nodes: 2 (0k, 0M)
    --7003-- memcheck: set_sec_vbits8 calls: 2 (new: 2, updates: 0)
    --7003-- memcheck: max shadow mem size: 608k, 0M
    --7003-- translate: fast SP updates identified: 4,736 ( 90.0%)
    --7003-- translate: generic_known SP updates identified: 311 ( 5.9%)
    --7003-- translate: generic_unknown SP updates identified: 215 ( 4.0%)
    --7003-- tt/tc: 9,052 tt lookups requiring 9,400 probes
    --7003-- tt/tc: 9,052 fast-cache updates, 3 flushes
    --7003-- transtab: new 4,381 (92,071 -> 1,351,372; ratio 146:10) [0 scs]
    --7003-- transtab: dumped 0 (0 -> ??)
    --7003-- transtab: discarded 54 (1,067 -> ??)
    --7003-- scheduler: 644,642 jumps (bb entries).
    --7003-- scheduler: 6/8,013 major/minor sched events.
    --7003-- sanity: 7 cheap, 2 expensive checks.
    --7003-- exectx: 769 lists, 182 contexts (avg 0 per list)
    --7003-- exectx: 3,128 searches, 2,967 full compares (948 per 1000)
    --7003-- exectx: 19 cmp2, 55 cmp4, 0 cmpAll
    --7003-- errormgr: 13 supplist searches, 447 comparisons during search
    --7003-- errormgr: 21 errlist searches, 55 comparisons during search
    et voici mon code pour la fonction prepare_chaine() :
    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
    static gchar* prepare_chaine(const char *format, va_list ap)
    {
      char t[1], *s = NULL;
      size_t taille = 0;
     
      const gchar *to_charset = NULL;
      gchar *new_s = NULL;
     
     
      taille = vsnprintf (t, 1, format, ap);
      taille++;
     
      s = malloc(taille*sizeof(*s));
      if(!s)
        return NULL;
     
      vsnprintf(s,taille,format,ap);
      taille -= 2;
      while(s[taille] == '\n')
        s[taille--] = '\0';
     
      setlocale(LC_ALL, "");
     
      if (g_get_charset(&to_charset))
        {
          new_s = g_convert(s, -1, to_charset, "ISO-8859-1", NULL, NULL, NULL);
     
          if (new_s == NULL)
        return s;
     
          free(s);
          return new_s;
        }
     
      return s;
    }
    Je ne vois pas trop ce qui peut provoquer la fuite de mémoire (je libère bien la chaine renvoyée par prepare_chaine()), mais je suis preneur pour toute solution .
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

Discussions similaires

  1. [MySQL] Comment afficher les erreurs MySQL en local ?
    Par Alcius dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 19/11/2010, 20h10
  2. Mon code php s'affiche lorsque je teste en local
    Par francis189 dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2010, 16h44
  3. Vérifier qu'une String respecte un encodage
    Par yusherboy dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 10/10/2008, 00h56
  4. Afficher des heures locales
    Par mrpowerboy dans le forum Applets
    Réponses: 3
    Dernier message: 27/09/2005, 17h57
  5. [ENCODAGE][JAVA]Afficher correctement des accents
    Par kornelius dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/02/2004, 16h37

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