パイプ/STDOUT/STDINでは、データはどのようにエンコードされますか?

パイプ/STDOUT/STDINでは、データはどのようにエンコードされますか?

私は最近さまざまなテキストエンコーディングを調べましたが、パイプラインでデータをエンコードする方法の良いソースが見つかりませんでした。

私の一般的な仮定は次のとおりです。

  1. パイプラインはバイナリを処理し、エンコードに依存しません。
  2. パイプの両端にあるアプリケーション(STDOUT / STDINを含む)は、テキストエンコード形式に同意する必要があります。
  3. ターミナル/コンソールもこれらのアプリケーションの1つと見なされ、同じエンコーディングを使用する必要があります。
  4. UnixアプリケーションはデフォルトでUTF-8を使用しますが、これは変更される可能性があります。

これは正しいですか?異なるデフォルト値を持つシステムでこれがどのように機能するかを拡張できますか?

質問を続けてください:

  • プログラムは端末にcat何を送信しますか?彼らはUnicodeで「考える」のですか?それとも、単にバイトを読み取り、バイトを送信してから端末にエンコードされたテキストを解釈させるのですか?

端末でエンコーディングを変更してみましたが、役に立たないようです。

$ printf 'ö' | hexdump
0000000 c3 b6
0000002
$ export LANG=en_US.UTF-16
$ printf 'ö' | hexdump
0000000 c3 b6
0000002

ベストアンサー1

以下で各点を取り上げます。

  1. パイプラインはバイナリを処理し、エンコードに依存しません。
    正しい。

  2. パイプの両端にあるアプリケーション(STDOUT / STDINを含む)は、テキストエンコード形式に同意する必要があります。
    私は言わないでしょう。テキストエンコーディング;テキストである必要はありません(通常はテキストであるにもかかわらず)。パイプから読み取るアプリケーションは、パイプに書き込むアプリケーションで何が起こるのかを知る必要があります。

  3. ターミナル/コンソールもこれらのアプリケーションの1つと見なされ、同じエンコーディングを使用する必要があります。
    端末はパイプに参加しません。プロセスの標準出力を端末に書き込む場合を考えると、端末はこれらのバイトを解釈します。これは、「テキスト」であっても、画面を消去したり、カーソル位置を変更するなどの操作を端末に指示する制御コードであってもよい。

    たとえば、次のことを考えてみましょう。

    $ clear | hexdump -c
    0000000 033   [   H 033   [   2   J 033   [   3   J
    

    つまり<esc>[H<esc>[2J<esc>[3J、ANSI制御シーケンスです。端末はこれを画面消去として解釈します。バラよりhttps://en.wikipedia.org/wiki/ANSI_escape_codeこれについて詳しく学んでください。

  4. Unix アプリケーションはデフォルトで UTF-8 を使用しますが、変更できます。
    繰り返しますが、これはパイプと直接関係がありません。デフォルトは「C」だと思います。これはデフォルトのASCII文字セットです。環境LANG変数は通常、プログラムで使用される文字エンコーディングを制御します。

おすすめ記事