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

GTK+ avec C & C++ Discussion :

problème chemins accentués


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Par défaut problème chemins accentués
    Bonjour,
    je me tourne vers vous car dans le programme que je suis en train d'écrire (en C avec GTK+ sous Windows 7), je rencontre un problème avec les chemins accentués:
    lorsque je récupère à l'aide d'un fileChooser le chemin (absolut) pour créer un fichier, si celui-ci a le malheur de contenir un accent, l'ouverture ensuite du fichier échoue (ce qui est assez embêtant vu que dans le nom d'utilisateur, j'ai déjà un accent, et qu'en plus je compte une fois fini le distribuer à quelques personnes sans que je sache s'ils ne sont pas dans le même cas (et des fichiers de sortie, généralement on les veut dans un dossier sur le bureau, pas à la racine du disque dur)).

    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
     GtkWidget *pFileChooser=NULL;
        pFileChooser=gtk_file_chooser_dialog_new("Ou voullez vous sauvegarder le rapport", NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,"Save",1,"Cancel",2,NULL);//, const gchar *first_button_text, ...);
     
        j=1;
        if (gtk_dialog_run(pFileChooser)==1)
        {
            j++;
        }
     
        FILE *fichier_de_rapport;
        char dateheure[256];
        time_t timestamp = time(NULL);
        while (j!=0)
        {
            j--;
            if (j==0)
            {
                fichier_de_rapport=NULL;
                strftime(dateheure, sizeof(dateheure), "data/rapport/rapport %Y %m %d    %H %M %S.txt", localtime(&timestamp));
                fichier_de_rapport=fopen(dateheure,"w+");
            }
            else
            {
                fichier_de_rapport=NULL;
                gchar *chemin;
                chemin=g_filename_from_utf8(gtk_file_chooser_get_filename(pFileChooser),100,NULL,NULL,NULL);
                chemin=gtk_file_chooser_get_filename(pFileChooser);
                strftime(dateheure, sizeof(dateheure), "data/rapport/rapport %Y %m %d    %H %M %S.txt", localtime(&timestamp));
                gchar cheminBis[100];
                strcpy(cheminBis,chemin);
     
                strcat(cheminBis,"\\");
                strcat(cheminBis,dateheure+13);
                //strcpy(fichier_de_rapport,chemin);
     
                printf("fichier_de_rapport=%s",cheminBis);
                fichier_de_rapport=fopen(cheminBis,"w+");
            }
     
     
            if (fichier_de_rapport!=NULL)
            {
                  //on remplit le fichier
            }
            fclose(fichier_de_rapport);
        }
        gtk_widget_destroy(pFileChooser);
    }
    en exécutant, si je choisis un chemin sans accents, tout va bien, mais dans le cas contraire, le fichier n'est pas créer et quand j'affiche avec printf en cossole le chemin, j'obtient:
    C:\Users\*é** ******\Desktop\rapport 2012 11 25 11 47 19 .txt
    je pense que le problème vient donc d'un nom invalide (je pense que l'ordinateur ne reconvertit pas le 'é' en le 'é' que c'était à l'origine).

    Ma question est donc la suivante :
    Comment faire pour pouvoir également choisir les emplacements dont les chemins contiennent ds accents?

    Merci d'avance
    katorps

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Ton code source est-il sauvé en UTF8 ? Cela peut tout changer. À essayer donc...

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Ton code source est-il sauvé en UTF8 ? Cela peut tout changer. À essayer donc...
    Cela n'a d'intérêt que s'il utilise des accents dans son code source (commentaires, chaînes de caractères), ce qui ne semble pas être le cas.

    Non, là c'est un problème récurrent: la GLib utilise UTF8 pour l'encodage des noms de fichiers, et Windows utilise UTF16 en NTFS. Du coup, il faut rajouter une étape de conversion des noms de fichiers Windows pour que la GLib puisse les interpréter.

    Ceci est confirmé dans la doc de la GLib sur la manipulation de fichiers:

    On Windows the GLib file name encoding is UTF-8. Note that the Microsoft C library does not use UTF-8, but has separate APIs for current system code page and wide characters (UTF-16). The GLib wrappers call the wide character API if present (on modern Windows systems), otherwise convert to/from the system code page.
    De ce que je comprends, il faut donc utiliser g_filename_from_utf8 pour convertir de l'encodage de la GLib vers celui de Windows et g_filename_to_utf8 pour faire l'inverse.

    Pense aussi à utiliser g_build_filename pour créer des chemins, plutôt que les concaténer à la main, car ce n'est pas portable.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Par rapport au code, les erreurs que je relève rapidement:

    La variable "chemin" est écrite dans l'encodage Windows à la ligne 26, mais écrasée en UTF8 ligne 27. Ensuite à la ligne 37, tu utilises fopen avec un nom de fichier en UTF8, alors qu'il attend de l'UTF16.

    Du coup, pour régler ton problème :
    supprime la ligne 26
    à la ligne 37, utilise g_fopen à la place à la place de fopen. g_fopen attend toujours un nom de fichier en UTF8, ça t'évite de faire des conversions.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Par défaut
    merci beaucoup pour vos réponses (et désolé d'avoir un peu tardé, mais on n'a toujours pas internet à l'internat).

    Je vais tester ça tout-à-l'heure.

    Merci encore
    katorps

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Par défaut
    Bonjour,
    désolé d'avoir mis du temps de nouveau a répondre, mais c'est bon, grâce à vos conseils ça fonctionne

    Merci beaucoup
    Katorps

    PS : désolé du double post, mais je n'ai pas trouvé comment éditer(), peut-être car le message date d'il y a déjà une semaine?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probléme chemin d'application
    Par laaroussi1 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 02/05/2007, 22h56
  2. Problème chemins relatifs lors du déboguage
    Par jomeo dans le forum Visual C++
    Réponses: 5
    Dernier message: 03/04/2007, 16h04
  3. [MySQL] [XML] problème caractères accentués
    Par Mathcoz dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 31/01/2007, 18h53
  4. [PHP][XSLT] problème caractères accentués
    Par beho dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 29/05/2006, 09h29
  5. [Struts] problème caractères accentués
    Par n00noors dans le forum Struts 1
    Réponses: 6
    Dernier message: 10/03/2006, 12h34

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