地平線を描く最も簡単なプログラム:
int main()
{ initscr(); for (int i=0;i<10;i++) addch(ACS_HLINE); getch(); endwin(); }
ローカルではうまく機能しますが、MOSHを介して接続した場合の結果はqqqqqqqqqqqです。
他の有名なncursesプログラムをこのようにテストしました(MOSHを介して接続されています)。しかし、他のテストでは、「醜い文字」も表示されました。例:Tetrisゲーム(bastet)、ダイアログボックス(シェルスクリプトでダイアログボックスを表示します)。
したがって、私のプログラムであるTetris、Dialog、およびその他のプログラムに関する上記の質問は次のとおりです。
- デフォルトでは、xtermと仮想端末(term = linux)とtmux / screenで動作します。
- SSH経由でもうまく機能します。
- MOSH クライアントで行の代わりに q および x 文字を表示します。
Moshは、ラップトップWi-Fiで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
例:use)も同じ内容を伝えます。
最新の端末説明を保持mosh
ncurses端末データベースから。要約すると、線を引く以上の問題があります。
答え2
非常にうまく機能するalsamixerのソースコードを分析した後、次の行が非常に重要であることがわかりました。
setlocale(LC_ALL, "");
で述べたようにc ライブラリ文書。これがない場合は、「C」ロケールがデフォルトです。
したがって、私のプログラムは現在MOSHよりも優れた性能を発揮します。
{ setlocale(LC_ALL, ""); initscr(); ... draw lines ... getch(); endwin(); }
しかし、プログラムの外でこの問題を解決する他の答えは受け入れます。ソースコードを変更せずにテトリスにこれを行うように強制する方法と同じです。