CtrlAlt私はFedora 12でCursesを使用してステータス情報をVT(+ +を押してアクセスできる端末の1つ)に出力しようとしていますFx。
VT() の 1 つでアプリケーションを実行すると、$TERM=linux
ボックスの行が、j
その他のいくつかの文字で表示されます。ただし、ターミナルウィンドウ()で実行すると、すべてが期待どおりに表示されます。q
k
$TERM=xterm
VT出力がxtermとして表示されるようにするには、どうすればよいのかを私に説明できますか?出力が正しくなるようにプログラムでターミナルを設定できますか?
答え1
良い答えは、まず質問を自分の言葉で説明し、次に関連部分を選択的に引用することです。内部にncurses FAQセクション@Craigは、問題を理解するのに役立つ詳細な側面が1つあると提案しました。
引用するライングラフィック部分用語情報(5)マニュアルページと該当ライングラフィック部分curs_add(3x)マニュアルページでは、cursesライブラリには、次の定義済みシンボル定数セットがあります。ACS_xxxxxさまざまな端末で同様のエスケープシーケンスを使用して描画されます。
最も一般的なバリエーションはVT100に基づいており、アプリケーションはライングラフィックを開始するために特殊文字(またはエスケープシーケンス)を送信します。モデルライングラフィックを終了する別の文字(またはエスケープシーケンス)です。
一部の端末エミュレータ開発者はこの概念に反対します。モデルUTF-8モードでテキストを作成するとき。斜めの言葉は気にしないでください(UTF-8エンコーディングを開始/停止するためのエスケープシーケンスがあります)。ただし、ncursesはこの機能を効率的にサポートします。ライングラフィックの作成方法を決定するのに役立つように、
- これは、VT100スタイルのライングラフィックを実行する方法のみを知らせることができる端末記述(環境変数で識別される)で始まります。
- UTF-8の場合は、他の環境変数を調べることでロケールエンコーディングを確認できます。
ncursesがUTF-8のみを使用する必要がある場合(ターミナルがVT100ライングラフィックをサポートしていないため)、十分なUnicode値を含む組み込みテーブルを使用してください。 UTF-8を使用して線を描くのは、VT100を使用して線を描くよりも必然的に3倍遅いです。これは、端末に送信される文字数がVT100を使用するよりも3倍多いからです。
これらすべてがUTF-8線の描画をライブラリの主な焦点ではなく「ただ」にします。 OPの例では、何か(おそらくロケール変数)が間違っています。 FedoraはUTF-8モードでコンソールを初期化し、LinuxコンソールはVT100線の描画を省略し、OPが画面に奇妙な文字を表示することが知られているケースです。
ncursesはOP環境をターミナル記述の機能をサポートすると解釈するため、VT100線描画モード(オーバーレイモードのためコンソールから無視されます)に切り替え、線にマッピングされると予想される文字を描画します。したがって、画面に次のように表示されることがあります。
lqqqqqqqqqqqqqqqk
x Hello world x
mqqqqqqqqqqqqqqqj
代わりに
┌───────────────┐
│ Hello world │
└───────────────┘
答え2
ncurses FAQからhttp://invisible-island.net/ncurses/ncurses.faq.html
線の描画文字は x と q で表されます。
xとqは、ncursesに「代替」文字セットを端末のグラフィック文字セットにマッピングする方法を示すテーブル(terminfo / termcapの)に対応します。この表への参照はvt100からのものです。マップされていない文字がある場合、ターミナルエミュレータは、通常のフォントと代替フォントの間の切り替えのためにterminfoの説明に提供されているエスケープシーケンスを認識しません。
注目すべきいくつかの状況があります。
- 異なるエスケープシーケンスまたは異なる範囲を使用して結果文字をマッピングする端末エミュレータ。 Linux Console や Tera Term など、いわゆる vt100 互換製品の例が挙げられます。
- ロケールを区別する端末エミュレータ。同様に、Linux コンソールは UTF-8 モードで実行する際の問題領域です。これは、フォントのエスケープシーケンス処理を省略すると、名目上のvt100互換性がさらに弱くなるためです。 screenユーティリティにも同じ問題があります。実装を簡素化するか、Linuxコンソールを複製するか、ロケールがUTF-8スタイルの場合、vt100スタイルのフォント切り替えを無視します。
- Solarisを使用すると、通常はncursesがインストールされていても、ncursesよりも端末データベースを優先するように構成されます。ただし、xtermターミナルの説明では、線画を有効にするためのenacは省略されています。これは、screenやluitなどのアプリケーションでは正しく機能しません。
最初のケースでは、正しいterminfoの説明を見つけてください。損傷がncursesの外で発生したため、後者を修正することはより困難です。 (この特定の問題が発生しないように十分に互換性があるようにするのは簡単ですが、いくつかのコーダーはこれらのスタイルの解決策が不適切だと思います)。
一般的なncursesライブラリは8ビット文字をサポートしています。 ncursesライブラリは、ワイド文字(UnicodeやUTF-8エンコーディングなど)をサポートするように設定(--enable-widec)することもできます。対応するワイド文字のncurseswライブラリは、通常のアプリケーションソースと互換性があります。つまり、アプリケーションはncurseswライブラリに対してコンパイルおよびリンクする必要があります。
ncurses バージョン 5.3 は UTF-8 サポートを提供します。 Linuxコンソールと画面の特性は、2002年後半に完了した開発パッチで解決されました。