コンソールの utf-8 シーケンス

コンソールの utf-8 シーケンス

コンソールで「tree」コマンドを実行すると、次のような結果が表示されます。

.
├── Annexe\ 1\ -\ Sch\303\251ma\ global\ de\ la\ base\ de\ donn\303\251es.raw
...

結果は UTF-8 シーケンスで構成されており、レポート用に人間が読める形式で文字列を取得する必要があります。この厄介なものを変換するにはどうすればよいでしょうか?

答え1

スイッチを使用して、使用したい任意の文字セットを指定できます--charset

   --charset charset
          Set the character set to use when outputting HTML and for line 
          drawing.

役立つ可能性のある 2 つのスイッチもあります。

   -q     Print non-printable characters in filenames as question marks 
          instead of the default.

   -N     Print non-printable characters as is instead of as escaped octal 
          numbers.

また、次のスイッチを使用して出力を拡張することもできます。

   -A     Turn on ANSI line graphics hack when printing the indentation 
          lines.

   -S     Turn on ASCII line graphics (useful when using Linux console mode 
          fonts). This option is now equivalent to `--charset=IBM437' and 
          may eventually be depreciated.

答え2

その出力は次のようにして得られます:

LC_ALL=C tree -A

0303 と 0251 は有効な文字 (またはロケールの文字シーケンス) ではない\303\251と思われるでしょう。tree

ただし、 が である UTF-8 ロケールでは有効で\303\251あり、 が であり である iso-8859-1 または iso- 8859-15 é(フランス語圏の国で一般的な 2 つの 1 文字あたり 1 バイトの文字セット) では有効\303です。Ã\251©

したがって、ここでは、ASCII が C ロケールの場合のように、文字セットが最初の 128 バイトの値に対してのみ定義されているロケールにいることが示唆されます。

文字セットが UTF-8 または iso-8859-15 であることがわかったらtree、0303 バイトは に変換されません \303

locale -aシステムに UTF-8 文字セットのロケールがあるかどうかがわかります。次に、次のように選択しますfr_FR.UTF-8

LC_ALL=fr_FR.UTF-8 tree

ただし、正しく表示されるかどうかは、ターミナル エミュレーターが何を理解しているかによって異なります。UTF-8 文字を表示するように設定されていない場合は、機能しません。

ターミナル エミュレータが iso-8859-1 を表示できる場合は、tree次のようにして UTF-8 を表示し、変換することができますiconv

LC_ALL=fr_FR.UTF-8 tree | iconv -f UTF-8

関連情報