Почему я не могу печатать символы не ASCII на консоли в режиме curses? - PullRequest
0 голосов
/ 10 июня 2019

Пожалуйста, рассмотрите этот простой фрагмент:

#include <stdio.h>
#include <curses.h>
#include <stdlib.h>
#include <stdbool.h>
#include <signal.h>


void cleanup(int signal)
{
  endwin();
  exit(0);
}


int main()
{
  initscr();
  struct sigaction cleanup_action = { .sa_handler = cleanup, .sa_flags = 0 };
  sigfillset(&cleanup_action.sa_mask);
  sigaction(SIGINT, &cleanup_action, NULL);
  cbreak();
  keypad(stdscr, TRUE);
  noecho();

  mvaddstr(2, 2, "?");
  mvaddstr(2, 3, "?");
  mvaddstr(2, 4, "?");
  mvaddstr(3, 2, "⬜");
  mvaddstr(3, 2, "⚾");
  mvaddstr(3, 4, "⬜");

  refresh();

  while(true) getch();
  return 0;
}

(Нет, я не уверен, что моя очистка при выходе правильная, но это не главное.)

Почемуэмоджи не распечатываются?

Когда я запускаю эту программу, я вижу следующее:

  ���~_��
  �~��~\

Я не понимаю этого, потому что согласно спецификации POSIX :

addnstr, addstr, mvaddnstr, mvaddstr, mvwaddnstr, mvwaddstr waddnstr, waddstr - добавить строку многобайтовых символов без отображения в окно и переместить курсор

"МУЛЬТИБАЙТ" говорят!Так что я думаю, это должно правильно распечатать!Я не ограничен ASCII!

Кроме того, я думаю, что мой терминал может обрабатывать эти символы.Это потому, что в отличие от curses.h, stdio.h может правильно их печатать:

#include <stdio.h>

int main()
{
  printf("?⬜⚾\n");
  return 0;
}

Это печатает:

?⬜⚾

Как я могу печатать эмодзи с помощью curses.h

...