Можете ли вы одновременно использовать функции printf () и ncurses в C? - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь напечатать символы, которые не входят в расширенную таблицу ASCII, в ncurses, но printw () поддерживает только печатаемые символы длиной 8 бит. printf (), однако, позволяет печатать символы выше 8 бит. Я хочу использовать функции ncurses, такие как move (), чтобы переместить расположение моего курсора, а также использовать printf () для печати символов выше 8 бит.

Есть несколько способов решения этой проблемы.

1) Каким-то образом разрешить вывод в режиме ncurses для символов выше 8 бит. Это включает в себя printw (), addch (), wprintw () и др. c. Я задавал вопросы по этой теме c раньше, с ограниченным результатом. addch () в моем компиляторе Ubuntu выведет некоторые значения ASCII выше 8 бит, но не все из них. Такие функции, как

addch(ACS_S1); addch(ACS_LANTERN);

, не распечатывают символ, а скорее распечатывают

2) У printf () одновременно работают функции ncurses, такие как move () и init_color (), чтобы я мог печатать символы выше 8 бит. Причина, по которой у меня возникают проблемы, заключается в том, что когда вы используете refre sh () в ncurses, он очищает нижний экран, заменяя его на используемое вами окно. printf () либо будет уничтожен, либо не будет работать вместе с move (). Я думаю, что может существовать функция перемещения, которая перемещает курсоры по заданным значениям c windows, что в этом случае может привести к перемещению печати, но я не знаю ни функции, ни экрана, на котором printf находится

Я использую Ubuntu, если это является частью проблемы. Я не думаю, что это так, но я включаю это только в случае. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

В вопросе говорится:

Я пытаюсь напечатать символы, которые не входят в расширенную таблицу ASCII, в ncurses, но printw () поддерживает только печатаемые символы длиной 8 бит.

На самом деле, библиотека ncurses ncursesw (обычно доступна с 2002 ) обрабатывает многобайтовые символы (например, UTF- 8), поэтому printw обрабатывает строки следующим образом:

char *foo = "  { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */";
printw ("%s", foo);

Он не будет интерпретировать такие вещи, как вы могли бы ожидать:

wchar_t foo = 0x04a6;
printw ("%c", foo);

с момента базовой C среды выполнения будет настаивать на том, что %c относится к char, а не wchar_t. Все это зависит от инициализации локали и использования правильной библиотеки.

Конечно, можно смешивать stdio и curses, но это не решит проблему, о которой вы спрашиваете (и для того, чтобы сделать это успешно, требуется некоторая работа ). Я делал это в ded (редактор каталогов) около 30 лет, используя часть экрана с проклятиями, а часть без.

0 голосов
/ 06 марта 2020

[независимо от путаницы с кодировками и поддержкой Unicode в ncurses, которая существует и идеально подходит для использования]:

Вместо функций curses вы можете использовать более низкий уровень tputs(.., putchar), который, поскольку он использует stdio putchar для записи escape-кодов может свободно смешиваться с другими функциями stdio, такими как printf или fwrite.

Пример, скомпилировать его с cc ... -ltinfo:

#include <stdio.h>
#include <term.h>
#include <err.h>

int main(void){
        char *cup;
        if(setupterm(0, 1, 0))
                errx(1, "setupterm failed");
        if(!(cup = tigetstr("cup")))
                errx(1, "no cursor addressing in terminal");
        tputs(tigetstr("smcup"), 1, putchar);

        tputs(tiparm(cup, 13, 13), 1, putchar);
        printf("HELLO");        /* or whatever you like */
        getchar();

        tputs(tigetstr("rmcup"), 1, putchar);
}
...