使用UTF-8和Putty时,Ncurses边界打印为Q,X

NCURSES border printing as q, x, when using UTF-8 and PuTTY

本文关键字:打印 边界 Ncurses Putty 使用 UTF-8      更新时间:2023-10-16

我正在尝试学习ncurses来为我的程序添加一些功能,但是我似乎无法将终端设置放在默认的ncurses window window border按预期显示的地步。

这是我要获得带有盒子边框的窗口的输出:

  lqqqqqqqqk
  x        x
  x        x
  x        x
  mqqqqqqqqj

但是我应该得到这个:

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

我唯一能够找到解决此问题的唯一一件事是将我的腻子删除字符设置为拉丁-1而不是utf-8,但是这会弄乱我的所有其他应用程序,包括vim。

有一些相关的问题,所以我发现的问题( 1 2 ),但是它们的解决方案都没有帮助我。我从第二个中拉出的唯一有趣的事情是,如果我在命令行中运行printf '342224224342224200342224220',它将打印出└─┐(这是正确的...)。

这是我用来测试以下简单程序:

 #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;
 }

有什么想法我会做什么错?谢谢!

您没有初始化语言环境。没有这些,ncurses将假定它可以使用终端描述。

进一步阅读:

  • ncurses手册页,初始化

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

setlocale(LC_ALL, "");

如果未初始化语言环境,则库假定 字符可打印,如ISO-8859-1中 某些旧计划。您应该初始化语言环境 并且不依赖库的具体细节 该语言环境尚未设置。

  • ncurses手册页, NCURSES_NO_UTF8_ACS

初始化中,ncurses库检查是否有VT100线绘制的特殊情况(以及相应的 替代字符集功能) 已知终端缺失。具体而言,在 utf-8 Locale 中运行时,Linux控制台仿真器和 GNU屏幕程序忽略这些程序。ncurses检查术语 这些环境变量。对于其他特殊情况, 您应该设置此环境变量。

解决方案将是在腻子配置中,以确保"启用VT100线绘图",即使在UTF-8模式下也可以进行。

PUTTY屏幕快照