Ncurses, Unicode: проблемы на некоторых терминалах - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь заставить 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;
}

Я могу суммировать проблемы в двух точках

  1. Когда я компилирую с 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 регулярно устанавливается пакет.

  2. Послесвязывание с 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");

...