$LANG이 터미널에 미치는 영향

$LANG이 터미널에 미치는 영향

나는 노력한다공부하다gnome-terminal $LANG(및 해당 문자 인코딩 기본 설정)에서 변수가 작동하는 방식. 나는 기본 문자 집합으로 iso8859-1(latin1)을 사용하고 있으며 모든 파일 이름은 이 방식으로 인코딩됩니다.

ls -l다음 테스트에서는 파일 이름에 스페인어 악센트 문자가 포함된 디렉터리를 만듭니다 .

사례 1:

  • ISO-8859-1로 구성된 gnome 터미널
  • LANG"en_US-iso8859-1"로 설정
  • 결과: 모든 파일이 올바르게 표시됩니다.

사례 #2:

  • gnome 터미널은 UTF-8로 구성됩니다.
  • LANG"en_US-iso8859-1"로 설정
  • 결과: 내가 보는 모든 스페인어 문자는 쓰레기 문자입니다. 이는 터미널의 문자 인코딩을 변경했기 때문에 예상되는 현상입니다.

사례 #3:

  • ISO-8859-1로 구성된 gnome 터미널
  • LANG"en_US-UTF-8"로 설정
  • 결과: 내가 보는 모든 스페인어 문자는 쓰레기 문자입니다.

마지막 경우에 잘못된 문자가 표시되는 이유는 무엇입니까? 출력되어서는 안 된다엘에스파일 이름을 gnome-terminal로 직접 보내시겠습니까? gnome-terminal은 ISO-8859-1에 맞게 구성되었으므로 올바르게 보이길 바랍니다.

잠시 동안 나는 bash가 내 $LANG변수를 고려하고 몇 가지 변환을 수행하고 있을 수도 있다고 생각했습니다. 그런 다음 터미널을 UTF-8로 전환했지만 여전히 올바른 문자가 표시되지 않습니다. 심지어 ls의 출력을 xxd로 파이프했는데 놀랍게도 ISO-8859-1이라는 파일이 그대로 인코딩되어 있는 것을 볼 수 있었습니다.

요약: 내 목록에 ISO-8859-1 문자가 포함되어 있고 내 터미널 에뮬레이터가 동일한 문자 인코딩으로 구성된 경우: LANG그렇지 않으면 설정 시 누가 변환을 수행합니까?

당신이 제공할 수 있는 도움에 감사드립니다.

크라코니아

답변1

설정은 LANG터미널 설정과 일치해야 합니다. 더 정확하게 말하면 (문자 인코딩) 설정이 LC_CTYPE터미널의 인코딩과 일치해야 하며 다른 로케일은 일치할 필요가 없습니다. 터미널의 인코딩은 일반적으로 로캘 변수가 아닌 터미널 에뮬레이터의 옵션에 의해 지정됩니다. 이는 LC_CTYPE두 가지 지침을 결합합니다. 즉, 터미널(입력 및 출력)에서 사용할 인코딩을 애플리케이션에 알려주고 파일에 사용할 인코딩을 애플리케이션에 알려줍니다. 사례 2와 3에서는 ls출력이 터미널과 다른 인코딩으로 표시되도록 지정했기 때문에 출력이 왜곡되었습니다.

UTF-8 및 latin-1 인코딩을 서로 다른 시간에 사용하는 경우 UTF-8을 사용하도록 터미널을 구성하십시오. 이로 인해 LC_CTYPEUTF-8을 나타내는 값이 설정됩니다 . 이 설정을 재정의하지 마세요. (터미널 에뮬레이터가 이를 설정하지 않은 경우 LC_CTYPE쉘 시작 파일 또는 전체 세션에서 이를 대체하십시오.) UTF-8 터미널에서 latin-1 데이터를 사용하려면 다음을 사용하십시오.luit(X 유틸리티 제품군에 포함됨)

LC_CTYPE=en_US.iso88591 luit

(예를 들어 동일한 인코딩을 사용하는 다른 로케일을 사용할 수 있습니다 LC_CTYPE=es_ES.iso88591 luit.)

답변2

사례 #2와 #3에서는 UTF-8과 Latin-1이라는 두 가지 다른 인코딩을 혼합합니다. #1의 경우 둘 다에 Latin-1을 사용하므로 문제가 없습니다.

ls명령(및 잘 실행되는 다른 모든 프로그램)은 LANG 설정을 사용하여코딩.

두 가지 다른 언어를 혼합할 수 있지만두 가지 다른 인코딩을 혼합하면 안 됩니다..

LC_* 환경 변수도 LANG 변수와 동일한 인코딩을 사용하는지 확인하십시오.

경험상 이제 UTF-8만 사용하도록 시스템을 구성해야 합니다.

오래된 데이터 파일(예: Java 속성)을 편집해야 하는 경우 특수 편집기(예: Java IDE)를 사용하거나 iconv"recode.."와 같은 도구를 사용하여 인코딩을 확인해야 합니다.

답변3

필요한 것보다 많을 수도 있지만...

RHEL5 및 이전 버전에서는 예상치 못한 이유로 인해 많은 매뉴얼 페이지가 asciiized된 것으로 나타났습니다. 즉, 원래 매뉴얼 페이지가 기본 문자 세트에서 7비트 ASCII로 변환되었습니다. LC와 LANG로 무엇을 하든 매뉴얼 페이지는 latin1사실상 쓸모없는 매뉴얼 페이지를 생성할 것입니다. 모든 특수(8비트) 문자는 7비트 자리 표시자(일반적으로 )로 대체되었습니다 ??. 나는 이것이 재미있다고 생각한다.

그러나 utf8이러한 매뉴얼 페이지의 버전은 언어별 디렉토리에 있을 수 있습니다. 비결은 정확한 이름을 물어보는 것입니다. 예를 들어, latin1은 실제로 입니다 iso_8859-1. 맨페이지를 만들었고 LANG 설정이 올바른 경우 맨페이지는 언어별 하위 디렉터리( en/man7/iso_8859-1.7)에 있습니다. 그러나 어떤 이유로든 요청하면 iso-8859-1ASCII 버전이 제공됩니다.

관련 정보