Я пытаюсь заставить ncurses
работать с юникодами. Я нашел хороший учебник здесь . Однако у меня проблемы со следующим кодом:
#include <locale.h>
#include <curses.h>
#include <stdlib.h>
int
main (int argc, char *argv[])
{
setlocale(LC_ALL, "");
initscr();
printw("Euro\n");
printw("€\n"); // literal Unicode
printw("\u20ac\n"); // escaped Unicode (C99)
printw("%lc\n", L'€'); // wint_t
printw("%ls\n", L"€"); // wchar_t
addwstr(L"\u20AC\n"); // wchar_t
printw("\xe2\x82\xac\n"); // utf-8 encoded
addstr("\xe2\x82\xac\n"); // utf-8 encoded
for (int i = 0; i < 10; i++)
{
printw("%c %lc\n", '0' + i, L'0' + i);
}
getch();
endwin();
return EXIT_SUCCESS;
}
Я могу суммировать проблемы в двух точках
Когда я компилирую с gcc -c -Wall -Wextra -g -o build/main.o src/main.c
, я получаюсообщение
src/main.c:19:3: warning: implicit declaration of function ‘addwstr’; did you mean ‘addstr’? [-Wimplicit-function-declaration]
Я не знаю, почему я получаю такое сообщение. На самом деле, в curses.h
я вижу строку
#define addwstr(wstr) waddwstr(stdscr,(wstr))
[...]
extern NCURSES_EXPORT(int) waddwstr (WINDOW *,const wchar_t *); /* generated:WIDEC */
Я использую Arch в качестве дистрибутива и ncurses
регулярно устанавливается пакет.
Послесвязывание с gcc -lncursesw -D_GNU_SOURCE -D_DEFAULT_SOURCE -o bin/main build/main.o
, если запустить программу на некоторых консолях (например, KDE Konsole), вывод будет уродливым
Euro
~B
~B
~B
~B
0 1 2 3 4 5 6 7 8 9
, в то время как на каком-то другом (то есть встроенном в vscode) вывод будет желаемым:
Euro
€
€
€
€
€
€
€
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
Что происходит? Можете ли вы сказать мне, как заставить мой код компилироваться без предупреждения и работать на каждой консоли?
EDIT
Я думаю, что нашел решение проблемы 2). Для правильной работы достаточно использовать
setlocale(LC_ALL, "en_US.UTF-8");