首页 > 解决方案 > Ncurses,unicode:某些终端上的问题

问题描述

我正在尝试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;
}

我可以将问题总结为两点

  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
    

到底是怎么回事?你能告诉我如何让我的代码在没有警告的情况下编译并在每个控制台上工作吗?

编辑

我想我找到了问题 2) 的解决方案。使用就足够了

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

使事情正常进行

标签: cterminalncursescurses

解决方案


推荐阅读