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

时间:2016-12-30 01:44:58

标签: c++ putty ncurses

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

以下是带有框边框的窗口的输出结果:

  lqqqqqqqqk
  x        x
  x        x
  x        x
  mqqqqqqqqj

但是我应该得到这个:

  ┌────────┐
  │        │
  │        │
  │        │
  └────────┘

我唯一能找到解决此问题的方法是将我的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;
 }

任何想法我可能做错了什么?谢谢!

1 个答案:

答案 0 :(得分:5)

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

进一步阅读:

  

库使用调用程序具有的语言环境          初始化。这通常用setlocale完成:

     

setlocale(LC_ALL, "");

     

如果未初始化语言环境,则库会假定          字符可以在ISO-8859-1中打印,以便使用          某些遗产计划。您应该初始化区域设置          并且不依赖于库的具体细节          语言环境尚未设置。

  

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