NCurses over Mosh,替代字符集

NCurses over Mosh,替代字符集

绘制水平线的最简单程序:

int main()  
{ initscr(); for (int i=0;i<10;i++) addch(ACS_HLINE); getch(); endwin(); }

本地工作正常,但通过 MOSH 连接结果是 qqqqqqqqqq。

我用这种方式测试了其他著名的 ncurses 程序(通过 MOSH 连接),其中一些运行良好,例如:alsamixer、vim、tmux...但其他测试也显示了“丑陋的字符”,例如:俄罗斯方块游戏(bastet)、对话框(显示来自 shell 脚本的对话框)。

所以上面的我的程序、俄罗斯方块、对话框和其他程序的问题是:

  • 它在 xterm 和虚拟终端(term=linux)和 tmux/screen 中本地工作。
  • 它在 SSH 上也能很好地工作。
  • 它在 MOSH 客户端上显示 q 和 x 字符而不是行

Mosh 是一个非常有用的程序,可以解决笔记本电脑 wifi 上的 ssh 断开连接问题。它创建自己的终端并将 TERM 变量设置为 xterm。在通过 mosh 启动程序之前,术语变量是“xterm”,区域设置命令显示 LANG=en_US.UTF8,LC_ALL="",字体似乎没问题(测试不同字体的结果相同)

有人知道如何解决或进一步调试这个问题吗?

最简单的模拟:

sudo apt-get install mosh bastet    #<--install mosh and tetris
bastet                              #<--tetris works ok
mosh -- 127.0.0.1 bastet            #<--q and x chars instead of lines

答案1

它位于 ncurses 手册页:环境NCURSES_NO_UTF8_ACS可以设置为通知它终端无法识别所使用的 VT100 风格的画线代码。此外,U8终端描述中的功能(TERM=tmux例如使用)也告诉了它同样的事情。

有最新的终端描述mosh在 ncurses 终端数据库中。回顾一下,除了画线之外还有问题。

答案2

经过分析alsamixer的源代码(效果很好),发现这一行非常重要:

setlocale(LC_ALL, "");

如中提到的c 库文档。如果没有它,'C' 语言环境是默认的。

所以我的程序现在也比 MOSH 表现得更好:

{ setlocale(LC_ALL, ""); initscr(); ... draw lines ... getch(); endwin(); }

但我会接受在程序之外解决该问题的任何其他答案。就像如何在不更改源代码的情况下强制俄罗斯方块执行此操作。

相关内容