파이프/STDOUT/STDIN에서 데이터는 어떻게 인코딩됩니까?

파이프/STDOUT/STDIN에서 데이터는 어떻게 인코딩됩니까?

최근 다양한 텍스트 인코딩을 조사했지만 파이프라인에서 데이터를 인코딩하는 방법에 대한 좋은 소스를 찾을 수 없습니다.

내 일반적인 가정은 다음과 같습니다.

  1. 파이프라인은 바이너리를 처리하고 인코딩에 독립적입니다.
  2. 파이프 양쪽 끝의 애플리케이션(STDOUT/STDIN 포함)은 텍스트 인코딩 형식에 동의해야 합니다.
  3. 터미널/콘솔도 이러한 애플리케이션 중 하나로 간주되며 동일한 인코딩을 사용해야 합니다.
  4. Unix 응용프로그램은 기본적으로 UTF-8을 사용하지만 이는 변경될 수 있습니다.

이것이 정확합니까? 다른 기본값을 가진 시스템에서 이것이 어떻게 작동하는지 확장할 수 있습니까?

계속해서 질문하세요:

  • 프로그램은 터미널로 cat무엇을 보냅니까? 그들은 유니코드로 "생각"합니까? 아니면 단지 바이트를 읽고 바이트를 보낸 다음 터미널이 인코딩된 텍스트를 해석하도록 합니까?

터미널에서 인코딩을 변경해 보았지만 도움이 되지 않는 것 같습니다.

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

답변1

아래에서 각 요점을 다루겠습니다.

  1. 파이프라인은 바이너리를 처리하고 인코딩에 독립적입니다.
    옳은.

  2. 파이프 양쪽 끝의 애플리케이션(STDOUT/STDIN 포함)은 텍스트 인코딩 형식에 동의해야 합니다.
    난 말하지도 않을 거야텍스트인코딩; 텍스트일 필요는 없습니다(일반적으로 텍스트임에도 불구하고). 파이프에서 읽는 애플리케이션은 파이프에 쓰는 애플리케이션에 어떤 일이 발생하는지 알아야 합니다.

  3. 터미널/콘솔도 이러한 애플리케이션 중 하나로 간주되며 동일한 인코딩을 사용해야 합니다.
    터미널은 파이프에 참여하지 않습니다. 프로세스의 표준 출력을 터미널에 쓰는 경우를 고려하면 터미널은 이러한 바이트를 해석합니다. 이는 "텍스트"일 수도 있고 화면을 지우거나 커서 위치를 변경하는 등의 작업을 터미널에 지시하는 제어 코드일 수도 있습니다.

    예를 들어 다음을 고려하십시오.

    $ 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변수는 일반적으로 프로그램에서 사용되는 문자 인코딩을 제어합니다.

관련 정보