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 :

[Linux] Afficher un shell au démarrage du programme


Sujet :

C

  1. #41
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Ceci fonctionne sans problème chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <locale.h>
    #include <stdio.h>
     
    char chaine[255] = "test d'affichage avec des accents éèçàùê etc";
     
    int main()
    {
        if (setlocale(LC_ALL, "") == NULL) {
            printf("Unable to change locale\n");
            return 1;
        }
        printf("Test string: %s\n", chaine);
        return 0;
    }
    gcc a des options (-fexec-charset=charset, -fwide-exec-charset=charset, -finput-charset=charset) qui permettent d'aider dans certains cas si tu crains des mic-mac dans les charset utilisés (tu peux t'en servir pour dire que char c'est de l'utf-8 mais que les fichiers sources c'est du latin-1 par exemple).

  2. #42
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Ceci fonctionne sans problème chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <locale.h>
    #include <stdio.h>
     
    char chaine[255] = "test d'affichage avec des accents éèçàùê etc";
     
    int main()
    {
        if (setlocale(LC_ALL, "") == NULL) {
            printf("Unable to change locale\n");
            return 1;
        }
        printf("Test string: %s\n", chaine);
        return 0;
    }
    gcc a des options (-fexec-charset=charset, -fwide-exec-charset=charset, -finput-charset=charset) qui permettent d'aider dans certains cas si tu crains des mic-mac dans les charset utilisés (tu peux t'en servir pour dire que char c'est de l'utf-8 mais que les fichiers sources c'est du latin-1 par exemple).
    Chez moi ça ne fonctionne pas, j'ai des points d'interrogation à la place des caractères accentués .

  3. #43
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    gcc a des options (...) qui permettent d'aider dans certains cas si tu crains des mic-mac dans les charset utilisés
    Cette phrase et le code la précédent m'on fais supposer que les options sur gcc était une autre solution envisageable.

    EDIT:
    Après essai avec les options de gcc, j'obtiens cette erreur.
    "erreur: conversion de latin-1 vers UTF-8 n'est pas supporté par iconv"

    Donc je me permets de redire: "Chez moi ça ne fonctionne pas."

  4. #44
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut suppression remarque inutile
    Cette phrase et le code la précédent m'on fais supposer que les options sur gcc était une autre solution envisageable.
    Sur un système raisonnablement configuré, ça devrait marcher sans problème. Sur un autre, il faut effectivement faire des choses. Quoi, ça tient effectivement de la boule de cristal.

    Après essai avec les options de gcc, j'obtiens cette erreur.
    "erreur: conversion de latin-1 vers UTF-8 n'est pas supporté par iconv"

    Donc je me permets de redire: "Chez moi ça ne fonctionne pas."
    Tu tiens réellement à avoir ta solution toute faite? Désolé, je vais t'expliquer comment résoudre ton deuxième problème. Ca aidera pour ton premier. Pour le troisième, je ne suis pas compétant.

    Il est question de gcc et de ses options. Cherchons la doc:
    http://gcc.gnu.org/onlinedocs/gcc-4....cessor-Options

    Ca a rapport avec le préprocesseur, il y a peut-être plus d'info dans le manuel de celui-ci: http://gcc.gnu.org/onlinedocs/gcc-4....Character-sets

    Conclusion: les charsets doivent être supporté par iconv. man iconv?

    Ah, le programme a une option qui liste les charsets supporté. Essayons: iconv -l. Il y en a beaucoup. Voyons un peu: iconv -l | grep -i latin.

    Tire ta conclusion tout seul.

  5. #45
    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
    Citation Envoyé par Maniack Crudelis Voir le message
    Tout mes programmes sont écrit et compilé avec Code:block, et je peux imaginer que le programme sera forcément exécuté dans un xterm!
    Oui, mais le xterm lui-même, quel codage utilise-t-il ?

    La plupart du temps, sur les systèmes modernes, tu peux modifier le jeu de caractère du terminal (par exemple, le gnome-terminal propose un menu Terminal->Définir le codage des caractères).

  6. #46
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Oui, mais le xterm lui-même, quel codage utilise-t-il ?

    La plupart du temps, sur les systèmes modernes, tu peux modifier le jeu de caractère du terminal (par exemple, le gnome-terminal propose un menu Terminal->Définir le codage des caractères).
    Sur la konsole, il également possible de changer le codage. Et définissant le codage en ISO-8859-15 les accents se sont affichés correctement. Sur xterm j'ai pas accès aux options si facilement.

    Toutefois c'est déjà encourageant. Je peux imaginer que si je parviens à spécifier le même codage à xterm, les accents devraient passer correctement.
    Je vais me pencher à nouveau sur le man d'xterm, sachant à présent que ça devrait fonctionner avec ce codage.
    Merci de tes conseils Obsidian.

  7. #47
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    J'ai fais quelques recherches et essais.
    Il apparait que l'argument -en de xterm devrait être efficace.
    -en encoding
    positionne la ressource encodingMode à encoding, xterm interprète alors les données entrantes comme encodées dans le format spécifié.
    J'ai testé différentes manière de spécifier encoding à ISO 8859-15, faute de trouver dans le man la syntaxe attendue.
    J'obtiens systématiquement,
    couldn't find charset data for locale fr_FR.UTF-8
    Et un second message d'erreur identique portant sur la syntaxe utilisé pour ISO 8859-15
    Chaque fois le message d'erreur est suivie de "using ISO 8859-1". Le résultat est que je me retrouve avec un codage qui accepte les accents, certes, mais avec 2 messages d'erreurs le précédant...
    Auriez-vous une idée sur la syntaxe attendue par l'argument -en?

  8. #48
    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
    Citation Envoyé par Maniack Crudelis Voir le message
    Et un second message d'erreur identique portant sur la syntaxe utilisé pour ISO 8859-15 Chaque fois le message d'erreur est suivie de "using ISO 8859-1". Le résultat est que je me retrouve avec un codage qui accepte les accents, certes, mais avec 2 messages d'erreurs le précédant...
    Auriez-vous une idée sur la syntaxe attendue par l'argument -en?
    Tu es en train de mettre le doigt dans l'engrenage ! :-)

    En fait, tout ceci concerne la gestion des « locales » du système, dont les paramètres sont définis dans un certain nombre de variables d'environnement, à commencer par LANG, et dont tu peux obtenir la liste en tapant locale. Tu peux aussi taper locale -a pour connaître toutes les locales reconnues par ta machine.

    Je ne développe pas plus parce que je suis moi-même rouillé sur ce sujet. 'faudrait que je relise les docs.

  9. #49
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    En utilisant la commande locale, je constate que toutes mes variables sont définies à fr_FR.UTF-8. Celle-ci étant dans la liste obtenue via locale -a.
    De ce fait je comprends pas pourquoi j'obtiens un message d'erreur relatif à fr_FR.UTF-8.

    Du fait de la distribution du programme, je ne souhaite pas une modification permanente des variables d'environnement. Je me suis donc repenché sur setlocale. Mais la commande semble sans effet!

    Bien que ça ne soit vraiment pas l'idéal, je vais peut-être me contenter d'un message d'erreur sans conséquences .

  10. #50
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Pour les accents sur xterm je vais donc finalement utiliser l'option -en de xterm, soit
    xterm -en iso8859-15
    Ca fera l'affaire.

    Je marque donc ce post comme résolu. Et je tiens à vous remercier de votre aide, qui m'a permis de résoudre ce problème.

    Cordialement
    Maniack Crudelis

  11. #51
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Hélas, me revoilà sur ce post que je croyais résolu.

    En effet l'option -en iso8859-15 de xterm fonctionne mais renvoi une erreur, qui n'empêche pas le fonctionnement de xterm et du programme qui y est démarré.
    Toutefois, lors de l'appel de execl, il en est tout autre. L'erreur de xterm semble bloquer la fonction execl.

    En effet j'ai fais quelques essais, et il s'avère que dés lors que l'argument -en est présent, le message d'erreur s'affiche et les autres arguments d'xterm ne sont pas pris en compte.
    Par contre si j'exécute xterm avec les mêmes arguments depuis la konsole (sans omettre -en) tous les arguments sont pris en compte, malgré le message d'erreur. Et le programme s'exécute normalement.

  12. #52
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Donnes nous ton appel à execl.

  13. #53
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Voila en résumé les lignes de code concernant execl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sprintf(prog,"cd \"%s\"; \".%s\" %s",pwd,argv[0],args);
    execl("/usr/bin/xterm","/usr/bin/xterm","-hold","-en","iso8859-15","-e",prog,NULL);
    La chaine args correspond aux arguments du programme qui sera exécuté dans xterm. (Celui que j'utilise pour ces tests n'a pas d'arguments.)

    J'obtiens donc les messages d'erreur suivant:
    "Warning: couldn't find charset data for locale fr_FR.UTF-8; using ISO 8859-1.
    Couldn't exec: Aucun fichier ou dossier de ce type"

  14. #54
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Me revoila avec une solution.
    Mon problème d'argument -en ne s'est, en lui même, pas résolu. Et même plus, il s'est aggravé. En effet l'argument -en permettait l'affichage des accents sur xterm (mais pas sur la console!) mais il ne permettait pas d'ouvrir des fichiers contenant des caractères accentués. Ce dernier point étant un problème de taille, car on ne peut s'assurer que l'utilisateur n'aura jamais a entrer un chemin contenant des accents.

    Donc faisant d'une pierre deux coups (ou d'une dague deux morts), j'ai trouvé moyen de me passer de l'argument -en, et donc de l'erreur qui l'accompagnait. Tout en affichant correctement les accents, et qui plus est sur la console ainsi que sur xterm. L'ouverture des fichiers contenant des accents étant aussi supporté.

    Pour cela j'ai écrit une fonction qui change les codes ascii, afin d'afficher correctement les accents. La fonction tient compte du format d'entrée (utf-8 ou iso latin).
    Afin de trouver le codage des accents sur la console (j'ignore d'ailleurs de quel codage il s'agit) je me suis servit du travail de Thierry BLANDET, que j'ai trouvé ici. Que je tiens à remercier si il me lit, car son travail m'a ôté un pieux du pied!

    Voila donc la fonction que j'ai écrit, qui s'utilise très simplement dans un printf ou avant un fopen.
    J'espère qu'elle sera utile à d'autre.

    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
    char* linux_acc (const char* texte, char* chfunc)
    {
        int i,j;
        for (i=0,j=0;i<=strlen(texte);i++,j++)
        {
            if(texte[i] < 0)    //caractère spécial
            {
                if(texte[i] == -61)    //-61 correponds aux caractères accentué en UTF-8
                {   //Codage d'entrée en UTF-8
                    chfunc[j++] = 195;  //Première valeur des caractères spéciaux
                    chfunc[j] = texte[++i]+256;
                }
                else if(texte[i] > -33 && texte[i] < 0) //Entre -32 et -1, caractères accentué en iso latin
                {   //Codage d'entrée en iso latin
                    chfunc[j++] = 195;  //Première valeur des caractères spéciaux
                    chfunc[j] = texte[i]+192;
                }
                else
                    chfunc[j] = texte[i];   //Si caractère non reconnu, copie directe
            }
            else
                chfunc[j] = texte[i];   //Si caractère normal, copie directe
        }
        return (chfunc);
    }

  15. #55
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Pour convertir les charsets :

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Afficher un shell dans une fenêtre wxWidget
    Par BlueCat dans le forum wxWidgets
    Réponses: 3
    Dernier message: 05/09/2006, 22h38
  2. [NASM][Linux] Afficher une chaîne à l'écran
    Par aloula dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 26/04/2006, 07h17
  3. Réponses: 2
    Dernier message: 27/12/2005, 11h47
  4. [Linux] Afficher des étoiles
    Par xavier1936 dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 25/10/2005, 12h28
  5. Réponses: 7
    Dernier message: 02/09/2005, 15h15

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