web-dev-qa-db-ja.com

端末:特殊文字の表示

htopなどの一部のプログラムでは、線とフレームが正しく表示されません。代わりに、-および/として表示されます。

enter image description here

しかし、別のマシンでは、それらは適切な行として正しく表示されます。

enter image description here

これが端末の問題なのか、それとも何らかのパッケージが必要なのかはわかりません。

該当する場合:私のシステムはDebian Wheezy、私のインタープリターはbash、私のターミナルエミュレーターはgnome-terminalです。

11
Martin Vegter

一番上の例は非Unicodeロケール(ASCIIなど)で実行しています。 $ LANG環境変数を確認します(export | grep LANGを試してください)。ほとんどの場合、.UTF-8サフィックスは見つかりません。追加してみてください:

export LANG=$LANG.UTF-8

他の例は、最近のシェルのデフォルトであるはずのUTF-8ロケールで実行しています。 htopはあなたのロケールを検出し、ASCIIまたはUnicode文字のいずれかを表示するようです-下の画像では、素敵なUnicode文字が表示されますが、ASCIIを使用するとかなりきれいになります間に合わせのもの。上の画像のマシンのロケールをUnicodeのロケールに変更することをお勧めします( Locale-Debian Wiki を参照)。

それでもうまくいかない場合は、ターミナルエミュレータが問題である可能性があります。デフォルトのエンコーディングは非Unicodeである可能性があります。端末エミュレータのデフォルトのエンコーディングをUTF-8に変更します(xfce4-terminalの場合、[詳細設定]タブで見つけました)。できない場合は、現在のフォントがUnicodeをサポートしていない可能性があります。フォントをUnicodeのものに変更してみてください。

[不思議なことに、シェルセッションでロケールをASCIIに一度変更すると、htopは、変更後も常にASCII文字を表示します。なんらかの理由でシェルのロケールを時々変更している場合は、それが問題である可能性があります。]

11
raehik

奇妙なことに、htopはncursesを使用します。これにより、Unicodeの有無にかかわらず線を描画できます。ただし、ソースコードを CRT.c で確認すると、説明が表示されます。

#ifdef HAVE_LIBNCURSESW
   if(strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
      CRT_utf8 = true;
   else
      CRT_utf8 = false;
#endif

   CRT_treeStr =
#ifdef HAVE_LIBNCURSESW
      CRT_utf8 ? CRT_treeStrUtf8 :
#endif
      CRT_treeStrAscii;

そして CRT_treeStrUtf8 値は

const char *CRT_treeStrUtf8[TREE_STR_COUNT] = {
   "\xe2\x94\x80", // TREE_STR_HORZ ─
   "\xe2\x94\x82", // TREE_STR_VERT │
   "\xe2\x94\x9c", // TREE_STR_RTEE ├
   "\xe2\x94\x94", // TREE_STR_BEND └
   "\xe2\x94\x8c", // TREE_STR_TEND ┌
   "+",            // TREE_STR_OPEN +
   "\xe2\x94\x80", // TREE_STR_SHUT ─
};

ただし、ncurses(すべてのcurses実装)には、エンコーディングがUTF-8であるかどうかに依存しないこれらの移植可能なシンボルがあります。一部のアプリケーション( dialog--ascii-linesオプションなど)は、ASCII行を使用するためのオプションを提供します-drawingですが、ncursesで提供される線描画を使用しようとしないアプリケーションでも、ライブラリを効果的に使用できません。

つまり、そのような動作をするプログラムに遭遇した場合、それをバグとして開発者に報告する必要があります。

参考文献:

3
Thomas Dickey