当使用UTF-8和PuTTY时,NCURSES边界打印为q,x

wKa*_*vey 4 c++ putty ncurses

我正在尝试学习ncurses为我的程序添加一些功能但是我似乎无法将我的终端设置设置为默认的ncurses窗口边框按预期显示的点.

这是我得到的带有框边框的窗口的输出:

  lqqqqqqqqk
  x        x
  x        x
  x        x
  mqqqqqqqqj
Run Code Online (Sandbox Code Playgroud)

但是我应该得到这个:

  ??????????
  ?        ?
  ?        ?
  ?        ?
  ??????????
Run Code Online (Sandbox Code Playgroud)

我能找到的唯一解决这个问题的方法是将我的PuTTY删除字符集设置为Latin-1而不是UTF-8,但是这会混淆我的所有其他应用程序,包括VIM.

我找到了一些相关的SO问题(12)但是他们的解决方案都没有帮助我.我从第二个中删除的唯一有趣的事情是,如果我printf '\342\224\224\342\224\200\342\224\220'在命令行中运行它会打印出来???(这是正确的......).

这是我用来测试这个的简单程序:

 #include <iostream>
 #include <ncurses.h>
 #include <string>
 #include <cstring>

 int main() {
     WINDOW *my_win;
     int startx, starty, width, height;
     int ch;

     initscr();
     cbreak();
     keypad(stdscr, TRUE);
     refresh();

     int height = 5;
     int width = 10;
     my_win = newwin(height, width, 1, 2);
     box(my_win, 0, 0);
     wrefresh(my_win);

     getch();

     endwin();
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

我有什么想法可能做错了吗?谢谢!

Tho*_*key 5

您没有初始化区域设置.没有它,ncurses将假设它可以使用终端描述.

进一步阅读:

该库使用调用程序初始化的语言环境.通常使用setlocale完成:

setlocale(LC_ALL, "");

如果未初始化语言环境,则库假定字符可按ISO-8859-1打印,以使用某些旧程序.您应该初始化语言环境,而不是在未设置语言环境时依赖库的特定详细信息.

初始化期间,ncurses库检查特殊情况,其中已知缺少在terminfo中描述的VT100线条绘制(以及相应的替代字符集功能).具体来说,当在UTF-8语言环境中运行时,Linux控制台模拟器和GNU屏幕程序会忽略这些.Ncurses为这些检查TERM环境变量.对于其他特殊情况,您应该设置此环境变量.

  • 请注意,“LC_ALL”在标头“&lt;locale.h&gt;”中定义 (2认同)