[programmation] Caractères accentués ncurses (résolu)

Questions et astuces concernant l'installation et la configuration d'archlinux
Répondre
JPlaroche
Hankyu
Messages : 27
Inscription : lun. 30 mai 2011, 17:42

[programmation] Caractères accentués ncurses (résolu)

Message par JPlaroche »

Bonjour,
je n'arrive pas à me servir des caractères accentués,

j'ai lu dans toutes les doc misent à dispositions sur ARCH
pouvez-vous m'aider svp
j'ai essayé
#include </usr/include/cursesw.h>
#include </usr/include/curses.h>
etc...
avant de venir vous demandez ...
j'ai bien contrôlé comme demandé la locale
je spécifie que je travaille avec xterm mais j'ai essayé aussi avec xfce4-terminal et c'est le même problème.


mon locale.conf

Code : Tout sélectionner

LANG=fr_FR.UTF-8
LC_MESSAGES=fr_FR.UTF-8 
LC_COLLATE=C
]
locale -a

Code : Tout sélectionner

C
fr_FR.utf8
POSIX

locale

Code : Tout sélectionner

LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE=C
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES=fr_FR.UTF-8
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=

mon code

Code : Tout sélectionner

#include <stdio.h>

#include </usr/include/cursesw.h>

///  -D_XOPEN_SOURCE_EXTENDED  ça c'est le protocole demandé NCURSES Programming HOWTO

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

using namespace std;

 int main()
{
  setlocale(LC_ALL,"");
//    setlocale(LC_ALL,"fr_FR.UTF-8");      

 WINDOW * mainwin;
 int ch;
/// test pour   é    ne fonctionne pas    code clavier 169 et pour tous les caractères spéciaux

/// sans setlocale  é -->  ?  
/// quelque soi le setlocale cela ne fonctionne pas  é --> M-)


    if ( (mainwin = initscr()) == NULL ) {
    fprintf(stderr, "Error initialisation ncurses.\n");
    exit(EXIT_FAILURE);
    }
   cbreak();
   noecho();                   /*  Turn off key echoing                 */
   keypad(mainwin, TRUE);     /*  Enable the keypad for non-char keys  */

    mvaddstr(3, 10, "Press a key ('F1' to quit)...");
    mvprintw(4, 10, "TEST: ");
    refresh();
    while((ch = wgetch(mainwin)))
    {
        switch(ch)
        {
            case KEY_F(1):
                            printw("Press KEY_CLOSE to exit");
                            exit(0);
                            break;
            default:

 ///                               fprintf (pFile,"getch   %c\n",ch); //

/// pour détailler ce qui sort sur la console xterm 
                                mvprintw(5, 30," num test %3d",ch);               // 169 pour  'é'
                                mvwprintw(mainvin,5, 40," num test %3d",ch);      // 169 pour  'é'
                                mvprintw(6, 30," val test %s","      ");
                                mvprintw(6, 30," val test %c",ch);                // soi M-)  soi ?
                                move(10,30); printw(" --- test %s","     ");
                                move(10,30); printw(" --- test %4x",ch);


                            refresh();
                            break;
        }
    }
    return EXIT_SUCCESS;

}
compilation :

Code : Tout sélectionner


g++ -Wall -fexceptions -D_XOPEN_SOURCE_EXTENDED -g  -c /home/userx/Programation/key/main.cpp -o obj/Debug/main.o
g++  -o bin/Debug/testkey obj/Debug/main.o  -lncursesw 

merci :pappy:
Dernière modification par JPlaroche le mar. 10 déc. 2013, 05:13, modifié 1 fois.
Cordialement Votre. @bientôt
JPlaroche
Hankyu
Messages : 27
Inscription : lun. 30 mai 2011, 17:42

Re: Caractères accaentués ncurses

Message par JPlaroche »

il fallait prévoir que ncurses a été revisité par ARCH
la compile avec -D_XOPEN_SOURCE_EXTENDED ok cela je connaissais

j'avais bien compris qu'il n'y a que ncursew ce qui me parait normal, mais l'utilisation de get_wch ou wget_wch je n'avais pas percuté.

de plus tous les programmes donnés en exemples sont sans cette particularité voir slang et newt ou sur NCURSES Programming HOWTO

si on mettait dans le dossier ncurses un readme une information qui signal cela beaucoup beaucoup de temps de perdu aurais été évité.

il me reste a tester la compatibilité avec d'autre distribution (ps le teste n'ai pas exhaustif du programme que je veux publier)
il faut que locale soit ok mais il y a beaucoup de doc la dessus.


// int ch; à remplacer par
wint_t ch = 0;
ou wchar_t ch = 0;
// while((ch = wgetch(mainwin))) à remplacer
pour l'exemple
while(ch != KEY_F(1))
{ wget_wch(mainwin,&ch); // le plus important get_wch(variable wchart_t) ou wget_wch( fenetre window * ... , variable win_t ...)
de la doc ... pour ncursesw http://h30097.www3.hp.com/docs/base_doc ... NDEX_C.HTM

// mvprintw(6, 30," val test %c",ch);
mvprintw(6, 30," val test %lc",ch); // l = traitement unicode http://www.cplusplus.com/reference/cstdio/print

Code : Tout sélectionner

 ///   /usr/bin/xterm -geometry 132x43+80+50 -fa 'Monospace' -fs 14 -bg black -fg white -lc -e
 ///  -D_XOPEN_SOURCE_EXTENDED

    #include <stdio.h>

    #include </usr/include/cursesw.h>

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

    using namespace std;

     int main()
    {
    setlocale(LC_ALL,"");
  //    setlocale(LC_CTYPE,"fr_FR.UTF-8");

    WINDOW * mainwin;
    // int ch;
        wint_t ch = 0;



    /// dans le terminal  prénom = prénom
    /// test différent pour   é    ne fonctionne pas    code clavier 169   **** il devient 233 ce qui est correct **** et pour tous les caractères spéciaux  

    /// sans setlocale  1 car  une sorte de ?  c



        if ( (mainwin = initscr()) == NULL ) {
        fprintf(stderr, "Error initialisation ncurses.\n");
        exit(EXIT_FAILURE);
        }
       cbreak();
       noecho();                   /*  Turn off key echoing                 */
       keypad(mainwin, TRUE);     /*  Enable the keypad for non-char keys  */

        mvaddstr(3, 10, "Press a key ('F1' to quit)...");
        mvprintw(4, 10, "You pressed: ");
        refresh();
       //  while((ch = wgetch(mainwin)))

        while(ch != KEY_F(1))
        { wget_wch(mainwin,&ch);
            switch(ch)
            {
                case KEY_F(1):
                                printw("Press KEY_CLOSE to exit");
                                exit(0);
                                break;
                default:

     ///                               fprintf (pFile,"getch   %c\n",ch); //

    /// pour détailler ce qui sort sur la console xterm
                                    mvprintw(5, 30," num test %3d",ch);
                                    mvprintw(6, 30," val test %s","      ");
                                    mvprintw(6, 30," val test %lc",ch);
                                    move(10,30); printw(" --- test %s","     ");
                                    move(10,30); printw(" --- test %4x",ch);


                                refresh();
                                break;
            }
        }

        return EXIT_SUCCESS;

    }
Cordialement Votre. @bientôt
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17614
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: Caractères accaentués ncurses[RESOLU]

Message par benjarobin »

Je n'ai rien compris, mais tout ce que je peux te dire c'est que ArchLinux ne fait rien de spéciale aux paquets, ce sont les sources non patchés/modifiés.
C'est une règle de ArchLinux : Minimiser au maximum les patches, généralement les seuls acceptés sont soit un énorme risque de sécurité, soit que l'application ne veut plus du tout se lancer...

Edit : Après vérification, désolé d'être aussi brutale : Tu ne sais juste pas développer et lire une doc... La doc dit bien

Code : Tout sélectionner

int wget_wch(WINDOW *win, wint_t *wch);
Elle n'a jamais dit

Code : Tout sélectionner

int wget_wch(WINDOW *win, int *wch);
Pour ta défense les exemples que tu as du lire sont apparemment faux, un lien ?

Le code nettoyé...

Code : Tout sélectionner

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

using namespace std;

int main()
{
    setlocale(LC_ALL,"");

    WINDOW * mainwin;
    wint_t ch = 0;

    if ( (mainwin = initscr()) == NULL ) {
        fprintf(stderr, "Error initialisation ncurses.\n");
        exit(EXIT_FAILURE);
    }
    cbreak();
    noecho();                   /*  Turn off key echoing                 */
    keypad(mainwin, TRUE);     /*  Enable the keypad for non-char keys  */

    mvaddstr(3, 10, "Press a key ('F1' to quit)...");
    mvprintw(4, 10, "You pressed: ");
    refresh();

    while(ch != KEY_F(1))
    {
        wget_wch(mainwin,&ch);
        switch(ch)
        {
            case KEY_F(1):
                printw("Press KEY_CLOSE to exit");
                exit(0);
                break;
            default:
                mvprintw(5, 30," num test %3d",ch);
                mvprintw(6, 30," val test %s","      ");
                mvprintw(6, 30," val test %lc",ch);
                move(10,30); printw(" --- test %s","     ");
                move(10,30); printw(" --- test %4x",ch);
                
                refresh();
            break;
        }
    }

    return EXIT_SUCCESS;

}
Je te laisse lire la doc de la fonction
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
JPlaroche
Hankyu
Messages : 27
Inscription : lun. 30 mai 2011, 17:42

Re: [programmation] Caractères accentués ncurses (résolu)

Message par JPlaroche »

je suis sur Manjaro xfce,

je ne trouve pas la doc pouvez-vous m' indiquer ou svp et comment je serais ravi d'avoir de quoi me construire une documentation sur lequel je pourrais faire mon dossier .(j'ai pas dit gueuler) mais construire quelque chose .

si je viens sur ce forum c'est que la base est la même (Manjaro) et que beaucoup de sujets répondent à mes questions

quand au code il était 5h.. du matin et cela faisait plusieurs jours que je cherchais. il se peut que ce soit glisser une coquille désolé (je n'aime pas que le code sale)
j'ai aussi laisser volontairement avec des mises en commentaires le code à ne pas utiliser pour bien souligné ce qu'il faut faire . j'étais content d'avoir trouvé. Beaucoup de demande sur ce sujet et peut de réponses claires hormis UTF8 sur les «  locale. »

j'arrive de Ubuntu (09/2013) et là le même programme ne fonctionnait plus (mon codes y est déposé depuis un certain temps car j'ai aussi cherché et c'est sur linux.fr qu'il était dit de mettre _D_XOPEN_SOURCE_EXTENDED directive pour prendre en compte tous les caractères) aujourd'hui cela a été rajouté dans wikipédia NCURSES

j'utilisais int = wgetwh(windows *) et mvwprintw(.....);



sur le forum lors de recherche il est dit que ARCH à changé le mode NCURSES la critique pour moi étais positive NCURESESW et logique aujourd'hui avec UTF8, et c'est en allant sur UNIX que j'ai compris ce que je devais faire et en rapprochant le source cursesw.h chez IBM

je me permet...
Elle n'a jamais dit

Code : Tout sélectionner

int wget_wch(WINDOW *win, int *wch);
cela ne fonctionne pas ce n'est pas dans mon code de correction j'ai pris un copié collé de ce code qui était juste un test et fonctionne chez moi
________________________________________________________________________________
aujourd'hui je développe pour le plaisir (enfin presque) sur Manjaro car je trouve le système stable et que certaine option prise par ARCH me plaise même si cela me fait beaucoup de changement (flexibilié : mélange de logiciel depuis la logithèque Ubuntu ) mais j'y gagne en clarté.

je n'ai pas dit que la doc dont j'ai mis URL, mais celle sur Ncurses mise dans wiki lorsqu'on fait ncurses avec google int= wgetwch(windows*) et que cela ne marchais pas

de plus j'ai tellement essayé à tâtons ne comprenant pas pourquoi sur une machine cela fonctionnait. Pensant que je devais rater une marche malgré les testes fait avec slang libnewt ncurses .... depuis les sources proposées
http://tldp.org/HOWTO/NCURSES-Programmi ... IMPLEKEYEX


je n'ai pu me résoudre à accepter une tel erreur dans le paquet ou trouvé une manière de contourné ... je ne pouvais croire qu'une tel erreur soi faite donc j'ai cherché jusqu'à ce que je trouve. (trois semaines à fouiller sur le web ) et sur mon ancienne machine cela fonctionnait ( Dell vostro xfce4 12.4 Ubuntu)


pour moi lorsque une critique ou une question avec une solution est faite et pas invalidé je pense que c'est tout ok ....

si je pose une question cela m'empêche pas de continuer à chercher le temps d'avoir une réponse.
Pour moi le principal est que je trouve une solution propre et adaptée

je sais que l'on ne peut avoir de réponse de suite cela ne m'empêche pas d'avoir du respect pour ce qui sont là et qui passe beaucoup de temps au sain de la communauté ARCH pour la faire vivre.
àbientôt de te lire


je ne pense pas mal je ne juge pas je n'ai pas le temps de juger il faut pas prendre de travers ce que je dis je m'explique avec mes mots
Dernière modification par JPlaroche le mar. 10 déc. 2013, 19:01, modifié 1 fois.
Cordialement Votre. @bientôt
Tucnacek
Chu Ko Nu
Messages : 332
Inscription : sam. 28 sept. 2013, 22:40

Re: [programmation] Caractères accentués ncurses (résolu)

Message par Tucnacek »

Je suis un poil hors-sujet et je m'en excuse mais si comme tu l'écris :
JPlaroche a écrit :je suis sur manjaro,
Pourquoi diable ne pas poster sur le forum Manjaro ?
Par ailleurs, la documentation Manjaro est peut-être plus indiquée, même si "la base est la même" car les archers ne connaissent pas nécessairement les divergences de fonctionnement entre les deux distributions.
JPlaroche
Hankyu
Messages : 27
Inscription : lun. 30 mai 2011, 17:42

Re: [programmation] Caractères accentués ncurses (résolu)

Message par JPlaroche »

désolé mais pas assez de réponse qui me convienne et beaucoup de bonne chose sur ARCH

je n'ai pas encore senti le besoin de construire moi même a partir de ARCH je me sens pas capable actuelement.
mais quand je lis je trouve que ça marche

désolé de vous dérangé.

j'ai repris mon message pour être plus clair oups trop tard tu avais répondu

PS( je suis content d'avoir une réponse).
Cordialement Votre. @bientôt
Tucnacek
Chu Ko Nu
Messages : 332
Inscription : sam. 28 sept. 2013, 22:40

Re: [programmation] Caractères accentués ncurses (résolu)

Message par Tucnacek »

J'ai l'impression que mon intervention me contraint d'en faire une seconde, je m'en excuse auprès de toutes celles et de tous ceux qui liront ce sujet.
JPlaroche a écrit :désolé de vous dérangé.
Je ne souhaitais pas mettre en place un ostracisme quelconque vis-à-vis des utilisateurs d'une distribution, dérivée d'Archlinux comme Manjaro ou Archbang, ou même d'autres distributions, bien que leurs utilisateurs risquent alors de trouver moins de réponses pertinentes pour régler leurs soucis. Je n'ai rien contre les utilisateurs d'autres distributions ou d'autres OS et je n'ai aucun pouvoir de décision sur ce forum qui puisse me permettre de mettre en place une règle qui aurait pour résultat de bannir les utilisateurs d'autres distributions. Une telle règle n'aurait d'ailleurs probablement pour effet que de pousser ces utilisateurs à cacher leur utilisation d'une autre distribution et donc rendre la résolution de soucis plus périlleuse.

Si je t'ai conseillé d'aller te renseigner via les forums Manjaro, c'est parce qu'ils sont là pour cela. Certains problèmes n'apparaîtront pas sous Archlinux et peuvent en revanche toucher plusieurs utilisateurs de Manjaro. En venant chercher presque spontanément les réponses ici, les forums Manjaro n'en profiteront pas et ne pourront alors pas grandir.
De plus, les archers ne sont pas nécessairement compétents lorsqu'il s'agit de résoudre des problèmes sous Manjaro.

Enfin, la multiplication de sujet liés à Manjaro peut néanmoins avoir un effet négatif sur ce forum si la proportion de sujets qui n'est pas liée à Archlinux atteint des proportions trop importantes. Pour établir un mauvais parallèle ; que feraient les utilisateurs des forums Manjaro si des utilisateurs de Linux, débutants, venaient y poser leurs questions ? Manjaro n'est pas une Archlinux pour débutant, mais il serait alors peut-être bon que les utilisateurs de Manjaro ne considèrent pas les archers nécessairement aptes à résoudre leurs soucis, même si cela peut être le cas de certains utilisateurs qui répondront d'ailleurs avec plaisir.
JPlaroche
Hankyu
Messages : 27
Inscription : lun. 30 mai 2011, 17:42

Re: [programmation] Caractères accentués ncurses (résolu)

Message par JPlaroche »

je trouve tout à fait pertinente ta réponse.

j'avais posté mais pas de réponse mais je met toujours les réponses trouvé pour que ce qui cherche puisse avancé. (y compris sur le forum Manjaro)

vous héritez de votre notoriété et de votre profondeur dans vos choix et solutions qui portent leurs fruits
la communauté Manjaro est très jeunes et de plus le forum Français.
je n'ai que ARCH actuellement

actuellement toutes les réponses ( je les poses pas mais les consultes) sont d'un grand secours soit pour apprendre soit pour résoudre ....

Merci encore pour tout.
Cordialement Votre. @bientôt
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17614
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [programmation] Caractères accentués ncurses (résolu)

Message par benjarobin »

Tu es toujours aussi difficile à lire dès que tu parles technique... Synthétise...

Sinon j'ai compris ton erreur... wgetwch ne permet pas de récupérer un caractère Unicode comme l'indique la doc.
Sur toutes les distributions récentes, on utilise l'encodage Utf-8, ce qui implique un caractère unicode pour le "é" (2 Octets).
Sauf que Ubuntu utilisais (je pense que par défaut maintenant c'est de l'Utf-8) le latin-9 (ISO/CEI 8859-15), et en latin-9, le "é" tient toujours sur un octet...

Et pour la doc : http://linux.die.net/man/3/wgetch et http://linux.die.net/man/3/wget_wch

Code : Tout sélectionner

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

using namespace std;

int main()
{
    setlocale(LC_ALL,"");

    WINDOW * mainwin;
    wint_t ch = 0;
	int ch2 = 0;

    if ( (mainwin = initscr()) == NULL ) {
        fprintf(stderr, "Error initialisation ncurses.\n");
        exit(EXIT_FAILURE);
    }
    cbreak();
    noecho();                   /*  Turn off key echoing                 */
    keypad(mainwin, TRUE);     /*  Enable the keypad for non-char keys  */

    mvaddstr(3, 10, "Press a key ('F1' to quit)...");
    mvprintw(4, 10, "You pressed: ");
    refresh();

    while(ch != KEY_F(1))
    {
        //ch2 = wget_wch(mainwin,&ch);
        ch = wgetch(mainwin);
        //wgetch(mainwin);
        switch(ch)
        {
            case KEY_F(1):
                printw("Press KEY_CLOSE to exit");
                exit(0);
                break;
            default:
                mvprintw(5, 30," val test              ");
                mvprintw(5, 30," val test  %d  %lc", ch, ch);
                mvprintw(6, 30," retour              ");
                mvprintw(6, 30," retour %d  %lc", ch2, ch2);
                move(10,30); printw(" --- test      ");
                move(10,30); printw(" --- test %4x",ch);
               
                refresh();
            break;
        }
    }

    return EXIT_SUCCESS;

}
Avec le code actuel, si tu appuies sur "é", tu obtiendra A9
Si tu décomentes 1 ligne pour avoir

Code : Tout sélectionner

ch = wgetch(mainwin);
wgetch(mainwin);
Alors tu obtiendra C3

En latin-9 "é" le code est égale à : E9, et en Utf-8 : C3 A9
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
JPlaroche
Hankyu
Messages : 27
Inscription : lun. 30 mai 2011, 17:42

Re: [programmation] Caractères accentués ncurses (résolu)

Message par JPlaroche »

merci d'avoir répondu,
je reste en UTF8 j'ai trop connu de problème avec les codes page

j'avais compris pour l'histoire des 2 octets je me suis fait piégé et la règle du traitement avec UTF8 dans NCURSES (dont je donnes les sources) hormis sur la doc dont tu me spécifie n'est pas clair.

en tout cas merci d'avoir quand pris le temps de me lire.
Cordialement Votre. @bientôt
Répondre