Imprimer des caractères Unicode en C, en utilisant ncurses

Je dois dessiner une boîte en C, en utilisant ncurses;

Premièrement, j’ai défini quelques valeurs pour la simplicité:

#define RB "\e(0\x6a\e(B" (ASCII 188,Right bottom, for example) 

J’ai compilé avec gcc, sur Ubuntu, avec l’ -finput-charset=UTF-8 .

Mais si j’essaie d’imprimer avec addstr ou printw, j’obtiens le code hexa. Qu’est-ce que je fais mal?

ncurses définit les valeurs ACS_HLINE , ACS_VLINE , ACS_ULCORNER , ACS_URCORNER , ACS_LLCORNER et ACS_LRCORNER . Vous pouvez utiliser ces constantes dans addch et ses amis, ce qui devrait vous permettre de voir les caractères de boîte attendus. (Il y a beaucoup plus de caractères ACS; vous trouverez une liste complète dans man addch .)

ncurses besoin de savoir ce qu’il dessine car il a besoin de savoir exactement où se trouve le curseur tout le temps. Produire des séquences de contrôle de la console n’est pas une bonne idée; si ncurses sait comment gérer la séquence, il a sa propre abstraction pour la fonctionnalité et vous devez utiliser cette abstraction. L’ACS (“jeu de caractères alternatif”) définit l’une de ces abstractions.

Quelques problèmes:

  • si votre programme écrit quelque chose comme "\e(0\x6a\e(B" utilisant addstr , alors ncurses ( toute implémentation de curses) traduira les caractères individuels en forme imprimable comme décrit dans la page de manuel addch .
  • ncurses prend en charge le dessin au trait pour les pseudo-graphiques couramment utilisés à l’aide de symboles (tels que ACS_HLINE ) qui sont des caractères prédéfinis avec l’atsortingbut A_ALTCHARSET combiné. Vous pouvez en savoir plus sur ceux-ci dans la section Line Graphics de la page de manuel addch .
  • le code 0x6a est ASCII j , qui (étant donné un mappage de style VT100) serait le coin inférieur gauche. Le symbole des curses pour cela est ACS_LRCORNER .
  • vous ne pouvez pas écrire les caractères de dessin avec addstr ; au lieu de cela addch , addchstr sont utiles. Il existe également des fonctions orientées dessin au trait (voir box et amis).
  • fonctionnant sous Ubuntu, votre codage de parameters régionaux est probablement UTF-8. Pour que votre programme fonctionne correctement, vous devez initialiser les parameters régionaux, comme indiqué dans la section Initialisation de la page de manuel ncurses. En particulier:

    setlocale (LC_ALL, “”);

    En outre, votre programme doit établir un lien avec la bibliothèque ncurses w ( -lncursesw ) pour utiliser UTF-8, plutôt que simplement ncurses ( -lncurses ).

  • lors de la compilation sur Ubuntu, pour utiliser les définitions d’en-tête appropriées, vous devez définir _GNU_SOURCE .