1

ncursesアプリケーションを作成していますが、画面に特殊文字が印刷される方法に奇妙な問題があります。次に例を示します。

#include <ncurses.h>

int main(int argc, char *argv[])
{
  initscr();
  noecho();
  keypad(stdscr, TRUE);
  cbreak();
  curs_set(0);

  addch(ACS_LARROW);
  addch(' ');
  addch(ACS_UARROW);
  addch(' ');
  addch(ACS_DARROW);
  addch(' ');
  addch(ACS_RARROW);
  addch(' ');

  refresh();

  getch();

  endwin();

  return 0;
}

したがって、これをttyで実行すると、文字は矢印(←、↑、↓、→)として正しく印刷されますが、これをターミナルで実行しようとすると(gnome-terminalとLXTerminalで試しました)、これ出力は次のとおりです。

< ^ v >

この違いの理由はありますか?フォントに関連しているのではないかと思いましたが、私は本当にここの領域外にいて、グーグルは役に立ちませんでした。

lxterminal(または他の端末)にttyの同じ文字を出力させる方法に関する提案はありますか?

4

3 に答える 3

4

ncursesは、用語タイプに基づいて、ACS_LARROWおよびその友人に出力する文字を決定します。ttyではtermtypeが「linux」に設定されている可能性がありますが、gnome-terminalなどでは「xterm」に設定されている可能性があります。確かではありませんが、xtermのtermtypeがこれらの文字をサポートしていない可能性は十分にあります。

次のようにアプリケーションを実行してみてください。

env TERM=linux ./a.out

試すべき他の用語タイプは、gnome、rxvt、およびvt102です。これらは拡張ASCII文字を出力し、ターミナルエミュレータはそれらをサポートする必要があります。rxvt-unicodeがインストールされている場合は、それらを試すこともできます。これにより、これらの特別なシンボルの正しいユニコードコードポイントが出力されます。

于 2012-08-23T11:02:41.507 に答える
1

の設定TERMはほとんど関係ありません。重要なのは

  • ロケール
  • ライブラリの選択
  • 特定の端末エミュレータ

これの通常の理由は、プログラムがncurseswではなくncursesライブラリでビルドおよびリンクされていることです。

  • UTF-8 を使用するロケールで前者 ( ncurses ) を使用する場合、ncurses はUTF-8 を描画できないという理由だけで ASCII グラフィックを使用します。ncurseswはUTF-8 文字を使用して描画できます。
  • ncurseswを使用すると、プログラムは必要に応じて UTF-8 を使用します ( 2002 年以降、terminfo 情報または Unicode 値の組み込みテーブルを使用できます)。Linux コンソールscreenは、terminfo が端末の動作を説明できない既知の特殊なケースです。その他 (UTF-8 モードでの VT100 線画をサポートしていない端末) の場合は、 を設定しNCURSES_NO_UTF8_ACSます。
  • 実際、端末データベースには、VT100 と UTF-8 との互換性の欠如に対処する拡張機能があります (端末データベースのU8を参照)。ただし、ほとんどの人は TERM をxtermorに設定し、それらlinuxを同一視することがよくあります ( xterm FAQの注を参照)。
于 2015-09-02T00:40:50.780 に答える
1

ターミナル エミュレーションは 7 ビット ASCII でコード化されることがあり、このコード ページには矢印 (線とウェッジを含む) に対応する値がないため、ターミナルは近いもの (つまり、ウェッジのみ) を表示します。tty では、コンピューターのすべての機能 (UTF-8、カラー エンコーディングなど) があるため、端末は矢印を描画できます。

于 2012-08-23T10:23:12.980 に答える