画面を通しても私の端末がサポートするUnicodeの量を検出します。

画面を通しても私の端末がサポートするUnicodeの量を検出します。

問題は、私の端末が一目でわかり、時には色や他の下線などの特定の文字を使用するために適切なUnicodeを使用できるかどうかを知ることができることです。

すべての種類の仮想端末でまともなフォントが得られたため、動機付けられましたが、デフォルトのLinuxコンソールには256または512の同時記号の文字セットがあるため、フォント全体のサポートが期待できないことがわかりました。

最初は、$TERMまたはttyを使用できると思いましたが、問題は次のとおりです。 byobuも使用しているので、$TERM常に「screen.linux」です。 ttyの出力は/dev/pts/<some number>「実際」でも仮想でもありません。

$BYOBU_TTY/dev/tty1たとえば、++でセッションを開くと文字は表示されませんが、一部のX用語で同じセッションに接続すると正しく表示されますが、まだ表示されないため役に立ちません。変わらない。また、byobuが存在するかどうかを想定せずにそれを検出できることを願っています。CtrlAltF1$BYOBU_TTY

さらに、ロケールはすべての場合にen_US.UTF-8を表示します。

ただし、どういうわけかbyobu内でも、byobuセッションに接続されている端末によって異なる出力が使用されます(これを検出した特定のツールの名前を指定するため)。

端末とttyがあまりにも一般的な検索語であるようで、Googleを使用するのに苦労しています。私が思いつくことができる最高のものは推奨されるソリューション$TERMまたはttyソリューションです。

答え1

さて、まず、最近、ほとんどすべての端末があなたが意味する意味で「仮想」であることを指摘したいと思います。端末が実際のシリアルポートの反対側にあっても同じです。私の言葉は、その時代だった。VT-100S、知恵ターミナルと他の「物理的」、「実際の」ターミナルはほとんど消えました!

他にも、端末がサポートするUnicodeを検索したいとしましょう。 isにテスト文字を作成し、何が起こるかを確認します。 (テスト文字を作成した後に消去しようとすることはできますが、ユーザーにはまだしばらく表示されるか、消去が最初に正しく機能しない可能性があります。)

アイデアは、端末にカーソルの位置を知らせるように要求し、テスト文字を出力し、端末に再び位置を知らせるように要求し、2つの位置を比較して、端末のカーソルがどれだけ移動したかを確認することです。

端末の場所を問い合わせるには、次を参照してください。ここ。基本的に:

echo -e "\033[6n"; read -d R foo; echo -en "\nCurrent position: "; echo $foo | cut -d \[ -f 2

「é」を出力してみてください。この文字はUTF-8で2バイトを占めますが、画面では1列にのみ表示されます。 「é」を出力すると、カーソルが2位置移動することを検出すると、端末がUTF-8をまったくサポートしておらず、おそらく一種のゴミを出力している可能性があります。カーソルがまったく動かない場合、端末はおそらくASCII専用です。 1桁移動するとおめでとうございます。フランス語の単語が表示されることもあります。

「あ」を出力してみてください。この文字はUTF-8で3バイトを占めますが、画面では2つの列としてのみ表示されます。カーソルが0または3だけ動くと、上記のような悪いニュースがあります。 1ずつ移動すると、端末がUTF-8をサポートしているように見えますが、ワイド文字(固定幅フォント)については認識しません。 2つの列を移動すると、すべてが正常です。

有用な情報をもたらす他のプローブキャラクターを送ることができると確信しています。このタスクを自動的に実行できるツールはありません。

答え2

OPの実際の質問は、LinuxコンソールがどのUnicode値をサポートしているのか、およびscreen原則としてコンソールのUnicodeマッピングを検索してこれを実行できることです。

ソースkbdツリーには以下が含まれます。getunimap(とマンページ)。マンページには次の内容があります。

getunimapプログラムは古く、廃止されました。これでsetfontの一部です。

これは完全に正確ではありません。 setfont次のオプションがあります。同じもの:

   -ou file                                  
          Save previous Unicode map in file

違い:

  • setfontファイルとgetunimap標準出力への書き込み
  • getunimapコメントにマップする文字を表示します。

たとえば、

0x0c4   U+2500  # ─ 
0x0c4   U+2501  # ━ 
0x0b3   U+2502  # │ 
0x0b3   U+2503  # ┃ 
0x0da   U+250c  # ┌ 
0x0da   U+250d  # ┍ 
0x0da   U+250e  # ┎ 
0x0da   U+250f  # ┏ 
0x0bf   U+2510  # ┐ 
0x0bf   U+2511  # ┑ 
0x0bf   U+2512  # ┒ 
0x0bf   U+2513  # ┓ 
0x0c0   U+2514  # └ 
0x0c0   U+2515  # ┕ 
0x0c0   U+2516  # ┖ 
0x0c0   U+2517  # ┗ 

比較的

0xc4    U+2500
0xc4    U+2501
0xb3    U+2502
0xb3    U+2503
0xda    U+250c
0xda    U+250d
0xda    U+250e
0xda    U+250f
0xbf    U+2510
0xbf    U+2511
0xbf    U+2512
0xbf    U+2513
0xc0    U+2514
0xc0    U+2515
0xc0    U+2516
0xc0    U+2517

走っている場合screen(例:xterm走るいいえコンソールで)権限エラーが発生し、それを使用して解決できますsudo

どのフォントがロードされたかがわかったら、次のコマンドを使用して確認できます。 (特別な権限は必要ありません。)psfgettable、例えば、

zcat /usr/share/consolefonts/Lat2-Fixed16.psf.gz | psfgettable -

次に、フォントの読み込みに使用されたマッピングデータを表示しますsetfont(Unicodeマッピングを使用)。

#
# Character table extracted from font -
#
0x000   U+00a9
0x001   U+00ae
0x002   U+00dd
0x003   U+0104
0x004   U+2666 U+25c8 U+fffd
0x005   U+0105
0x006   U+0111
0x007   U+0150
0x008   U+0151
0x009   U+0162
0x00a   U+0164
0x00b   U+0170
0x00c   U+0171
0x00d   U+021a 
0x00e   U+02dd  
0x00f   U+2014 U+2015
0x010   U+2020
0x011   U+2021
0x012   U+2022 U+25cf
...

getunimapどちらもソートされているsetfontように見えますが、ソートされていないデータを提供しますpsfgettable(同じ文字形状にマップされたUnicode値の行を結合することも含みます)。したがって、違いはありますが、情報にアクセスできます。

showconsolefont追加資料(この問題を解決するためにこれが利用できない理由を説明してください):

答え3

同じことをしようとしましたが、画面に何も残して変数を設定したくなかったため、この問題が発生しました。だから私はソースとして提供したシェルスクリプトに次のものを入れました。

function test_unicode {
  echo -ne "\xe2\x88\xb4\033[6n\033[1K\r"
  read -d R foo
  echo -ne "\033[1K\r"
  echo -e "${foo}" | cut -d \[ -f 2 | cut -d";" -f 2 | (
    read UNICODE
    [ $UNICODE -eq 2 ] && return 0
    [ $UNICODE -ne 2 ] && return 1
  )
}

test_unicode
RC=$?
export UNICODE_SUPPORT=`[ $RC -eq 0 ] && echo "Y" || echo "N"`
unset test_unicode

関連情報