Linux端末では、ボックス文字が正しく表示されません。

Linux端末では、ボックス文字が正しく表示されません。

私はボックス文字を使用して情報を表示するC ++]プログラムを作成しました。ターミナルアプリを使ってmacOSでプログラムを実行しましたが、うまくいきました。

私が切り替えたときDebian Linux同じコードを使用して再コンパイルしたところ、この問題が発生しました!オンラインで回答を検索しましたが、この質問に関連する回答が見つかりませんでした。私はこれを両方でテストしましたLX端子そして URXVT

以下は、この問題に対して再現可能な最小限の例です。

#include <ncurses.h>
#include <iostream>

int ch;

int main() {
    setlocale(LC_CTYPE, "");
    initscr();
    noecho();
    keypad(stdscr, true);
    nodelay(stdscr, true);
    curs_set(0);
    start_color();
    use_default_colors();

    init_pair(1, COLOR_BLUE, -1);

    clear();
    refresh();

    while ((ch = getch()) != 'q' && ch != 'Q') {

        attrset(COLOR_PAIR(1));

        mvprintw(0,0,"┏━┓");
        mvprintw(1,0,"┗━┛");

    }

    refresh();
    endwin();

    return 0;
}

次のコマンドを使用してこのデモをコンパイルします。

g++ -g -c -o main.o test.cpp && g++ -g -o test main.o -std=c++11 -Wall -pedantic -lncurses

または

LDLIBS=-lncurses make test

表示する代わりに

┏━┓
┗━┛

次のように表示されます。

M-b~T~OM-b~T~AM-b~T~S
M-b~T~WM-b~T~AM-b~T~[

実際の画面イメージ

macOSの一般(必須)表示:

macOSの一般(必須)表示

Linuxでは例外が表示されます。

Linuxでの異常な表示

ベストアンサー1

問題は、別の記号を使用するのではなく、リテラル文字、、、、、を使用していることです。 (pper / owerとeft / ight)とシンボル名を使用する必要があり、端末でこれらの名前を表す方法を学びましょう。ncursesACS_??CORNERULLRACS_HLINEncurses

ここでコードを修正してください。

mvprintw(0,0,"┏━┓");
mvprintw(1,0,"┗━┛");

これに関して、

move(0,0); addch(ACS_ULCORNER); addch(ACS_HLINE); addch(ACS_URCORNER);
move(1,0); addch(ACS_LLCORNER); addch(ACS_HLINE); addch(ACS_LRCORNER);

コードは移植可能に動作する必要があります。また、プログラム終了時に端末が正しくリセットされるように、プログラムmain()の終了を単純から次のように変更しました。return 0

endwin();
exit(0);

コンパイルtest.cppして実行し、

LDLIBS=-lncurses make test && ./test

特別な順序なしで便利な参考資料:

おすすめ記事