绘制水平线的最简单程序:
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(); }
但我会接受在程序之外解决该问题的任何其他答案。就像如何在不更改源代码的情况下强制俄罗斯方块执行此操作。