Forum Programmation.c Recuperation charset courant

Posté par  .
Étiquettes : aucune
0
25
jan.
2006
Salut beau forum,

j'ai un petit soucis en C pour récupérer le charset courant. Je m'explique : je présume pour ça qu'il faut le faire avec setlocale.

Actuellement je fais ça :

#include <locale.h>;
#include <stdio.h>;
int main (int argc, char **argv) {
char *locale;

locale=setlocale(LC_ALL, "");
fprintf(stderr, "La locale est %s\n", locale);

locale=setlocale(LC_CTYPE, "");
fprintf(stderr, "La locale est %s\n", locale);
}


Et j'obtiens :
La locale est fr_FR.UTF-8

La locale est fr_FR.UTF-8

Est ce qu'il y a un moyen simple de n'obtenir que le "UTF-8" ?

Merci par avance.
  • # ...

    Posté par  . Évalué à 1.

    Je ne fais pas du C mais si tu coupes la chaîne en utilisant le point comme séparateur??? Il y a peut-être plus direct
    • [^] # Re: ...

      Posté par  . Évalué à 2.

      sinon tu pourrais essayer ca :


      #include <stdio.h>
      #include <locale.h>
      #include <langinfo.h>


      int main () {
      setlocale(LC_ALL, "");
      printf("%s\n", nl_langinfo(CODESET));
      }
      • [^] # Re: ...

        Posté par  . Évalué à 0.

        langinfo.h ne fait pas partie du C, il s'agit d'une extension qui peut ne pas être disponible suivant l'environnement de l'utilisateur. La solution proposée par zgnouf et Gérald est la bonne; à une restriction près toutefois : le format de la chaîne retournée par setlocale n'est pas déterminé par la norme C (arrêtez-moi si je me trompe), donc il n'est pas garanti qu'il y ait un point dans cette chaîne. Il faudra donc traiter le cas où il n'y a pas de point séparément (en ajoutant un if (charset == NULL) { /* ... */ } dans le code de Gérald).

        D'ailleurs, si quelqu'un sait où le format de la locale est défini (C, POSIX...?)...
        • [^] # Re: ...

          Posté par  . Évalué à 1.

          Pour me compléter : la locale "C" est la seule définie dans la norme C (pour ce que j'ai trouvé dans le paragraphe 7.11), et elle ne contient pas de point, il serait donc bien de prende en compte au moins ce cas.
          Je n'ai pas la norme POSIX sous la main, je ne peux donc vérifier ce qu'elle en dit.
        • [^] # Re: ...

          Posté par  . Évalué à 1.

          bof... ca fait partie des single unix specification. c'est donc suffisant pour faire un truc portable sur la plupart des unix.
          par contre se baser sur les variables de locale pour ca c'est beaucoup plus dangereux vu que ca peut contenir un peu n'importe quoi.
          enfin tout ca pour dire que ma solution est en tout cas loin d'etre pire.
      • [^] # J'oubliais...

        Posté par  . Évalué à 0.

        Avec tout ça, j'ai oublié:
        int main(void)
        non mais ! ;)
        Et comme main est déclarée comme retournant un entier, il est bon d'en retourner vraiment un ! Donc (code non testé):

        #include <stdio.h>
        #include <stdlib.h>
        #include <locale.h>

        int
        main (void)
        {
            char *locale = NULL;
             char *charset = NULL;
             locale = setlocale(LC_ALL, "");
             charset = strchr(locale,'.');
             if (charset == NULL)
             {
                 fprintf(stderr, "La locale est %s\n", locale);
             }
             else
             {
                 fprintf(stderr, "La locale est %s\n", ++charset);
             }
             return EXIT_SUCCES;
        }
  • # simple...

    Posté par  . Évalué à 2.

    En ajoutant ça:


    #include <locale.h>;
    #include <stdio.h>;
    int main (int argc, char **argv) {
    char *locale,*charset;
    locale=setlocale(LC_ALL, "");
    charset=strchr(locale,'.');
    fprintf(stderr, "La locale est %s\n", ++charset);
    }
  • # Dans la glib

    Posté par  . Évalué à 2.

    Ce que tu veux faire existe dans la glib, peut être serait-il judicieux de l'utiliser ? Dans tous les cas, je tinvite à regarder les sources de la fonction g_get_charset de la glib.

    g_get_charset ()
    Obtains the character set for the current locale; you might use this character set as an argument to g_convert(), to convert from the current locale's encoding to some other encoding. (Frequently g_locale_to_utf8() and g_locale_from_utf8() are nice shortcuts, though.)
  • # Merci

    Posté par  . Évalué à 1.

    Merci à vous tous pour vos réponses.

    En fait ce que je cheerche c'est une solution qui justement évite de devoir chercher le ".", qui soit donc robuste...

    Je vais donc chercher du coté de g_get_charset()

Suivre le flux des commentaires

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