ncurses: ввод и вывод русского символа на экран
Возникла проблема с русской кодировкой при работе с ncurses. Пытаюсь получить любой русский символ от пользователя и вывести его на экран
#include <ncurses.h>
#include <locale.h>
#include <unistd.h>
int main(void)
{
setlocale(LC_ALL, "");
int c;
initscr();
noecho();
curs_set(0);
c = getch();
mvprintw(0, 0, "%c", c);
refresh();
sleep(2);
endwin();
return 0;
}
gcc -g3 file.c -lncurses
В итоге наблюдаю пустой экран, русские символы не отображаются, а вот латиница успешно отображается. Многие советуют использовать
wchar_t c;
Но это почему-то не помогает, и на экране пусто. В gdb видно что c выглядит как что-то подобное 209 L'Ñ'. Встречался ли кто-то с этой проблемой?
Ответы (1 шт):
Многие советуют использовать
wchar_t c;
Это правильный совет. Других адекватных способов работы с многобайтовыми локалями нет. Для широких символов в ncurses есть отдельная библиотека: ncursesw с отдельным набором хедеров (обычно в /usr/include/ncursesw). Кроме того для широких символов есть свои версии функций. Нормальной документации я не видел, но неплохой список аналогов есть здесь.
#include <wchar.h>
#include <ncurses.h>
#include <locale.h>
#include <unistd.h>
int main(void)
{
setlocale(LC_ALL, "");
wint_t c;
initscr();
noecho();
curs_set(0);
do {
mvaddwstr(0, 0, L"Жмакни `ы`, дабы выйти!");
int rc = get_wch(&c);
if (rc==OK) {
mvprintw(1, 0, "Символ: %lc", c);
}
refresh();
} while (c != L'ы');
endwin();
return 0;
}
Сборка:
gcc file.c $(pkg-config ncursesw --libs --cflags)
Примечание:
Для mvprintw() аналога, который принимал бы формат в виде широкой строки (вроде wprintf()) нет, так что на машинах с необычной локалью (отличающейся от кодировки исходников) оно будет работать не совсем корректно. Ради большей переносимости стоит избегать функции семейства mvprintw() и использовать wsprintf() в комбинации с mvaddwstr(). Но IRL всё это обычно нивелируется тем, что строки с не базовыми символами не записаны в коде, а получаются от библиотеки вроде gettext.