Ncurses,unicode:某些终端上的问题

Ncurses,unicode:某些终端上的问题,c,terminal,ncurses,curses,C,Terminal,Ncurses,Curses,我正在尝试使ncurses与unicodes一起工作。我找到了一本不错的教程。但是,我在以下代码中遇到问题: #include <locale.h> #include <curses.h> #include <stdlib.h> int main (int argc, char *argv[]) { setlocale(LC_ALL, ""); initscr(); printw("Euro\n"); printw("€\n");

我正在尝试使
ncurses
与unicodes一起工作。我找到了一本不错的教程。但是,我在以下代码中遇到问题:

#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;
}
我不知道为什么我会收到这样的信息。事实上,在
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
    
  • 发生了什么事?你能告诉我如何让我的代码在没有警告的情况下编译并在每个控制台上工作吗

    编辑 我想我找到了解决问题2)的办法。用它就足够了

    setlocale(LC_ALL, "en_US.UTF-8");
    

    为了使事情正常进行

    我以前遇到过一些关于诅咒的问题。它不是标准的Unix库,因此可移植性受到限制。将它与Unicode相结合只会使它变得更糟,因为并不是所有东西都支持它。您的问题可能与其中一个不兼容。您指的是问题1还是问题2?问题2。我不知道为什么会出现问题1,尽管您从
    curses.h
    中引用的是
    waddwstr
    ,而不是
    addwstr
    ,如1中的错误所示。请参阅编辑。第二个问题似乎已经解决。第一个仍然存在
    addwstr
    是根据我编辑的
    waddwstr
    定义的。或者,可能是重复的。无论哪种方式,手册页都是开始的地方。
    setlocale(LC_ALL, "en_US.UTF-8");