터미널에서 $ LANG의 영향


11

변수가 gnome-terminal (및 문자 인코딩 환경 설정 옵션)으로 어떻게 작동하는지 배우 려고합니다 $LANG. 필자는 기본 문자 집합으로 iso8859-1 (latin1)을 사용했으며 모든 파일 이름이 그대로 인코딩되었습니다.

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

사례 # 1 :

  • ISO-8859-1에 대해 구성된 그놈 터미널
  • LANG "en_US-iso8859-1"로 설정
  • 결과 : 모든 파일을 올바르게 볼 수 있습니다

사례 # 2 :

  • UTF-8에 대해 구성된 그놈 터미널
  • LANG "en_US-iso8859-1"로 설정
  • 결과 : 모든 스페인어 문자에 가비지 문자가 표시됩니다. 터미널의 문자 인코딩을 변경했을 때 예상됩니다.

사례 # 3 :

  • ISO-8859-1에 대해 구성된 그놈 터미널
  • LANG "en_US-UTF-8"로 설정
  • 결과 : 모든 스페인어 문자에 가비지 문자가 표시됩니다.

이 마지막 경우에 문자가 깨지는 이유는 무엇입니까? ls 의 출력이 파일 이름을 그대로 그놈 터미널로 보내서는 안됩니까? 그리고 gnome-terminal은 ISO-8859-1 용으로 구성되었으므로 제대로 표시 될 것으로 기대했을 것입니다.

잠시 동안 나는 아마도 bash가 내 $LANG변수를 고려 하고 약간의 변환을 수행 한다고 생각했습니다 . 그런 다음 터미널을 UTF-8로 전환했지만 여전히 문자를 올바르게 볼 수 없습니다. 심지어 ls의 출력을 xxd로 파이프하고 놀랍게도 ISO-8859-1과 같이 인코딩 된 파일을 여전히 봅니다.

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

도움을 주셔서 감사합니다.

크라 코니아

답변:


5

에 대한 설정 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.)


특히 LC_CTYPE에 대한 두 가지 표시를 설명하는 훌륭한 설명에 대해 Gilles에게 감사드립니다.
Craconia

마지막 사례로 돌아갑니다. 모든 파일 이름이 latin1로 인코딩되고 최종 출력 장치, 글리프를 만드는 장치 (내 터미널)도 latin1로 구성되었다는 사실 때문에 파일을 올바르게 볼 것으로 기대했습니다 (LC_CTYPE에 관계없이) ...
Craconia

lsLC_CTYPE (이 경우 UTF-8로 설정)을 고려하고 일종의 문자 세트 유효성 검사를 수행하는 것은 결코 나에게 발생 하지 않았습니다. 문자 세트와 호환되지 않는 것을 볼 때마다 특정 문자를 뱉을 것입니다 (예 : "? "). "유효성"이라고 말했지만 루트처럼 "전환"을 수행하지 않기 때문입니다. 이런가요?
Craconia

@Craconia 세 번째 경우 ls인쇄 할 수없는 문자를로 바꿉니다 ?. 실제 단어를 나타내는 라틴 -1로 인코딩 된 대부분의 문자열은 UTF-8로 해석 될 경우 인쇄 할 수없는 문자를 갖습니다.
Gilles 'SO- 악마 그만'

5

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

ls명령 (다른 모든 웰의 행동하는 용 프로그램)을 결정하기위한 LANG 설정을 사용하여 인코딩 .

두 개의 다른 언어를 혼합 할 수 있지만 두 개의 다른 인코딩을 혼합해서는 안됩니다 .

LC_ * 환경 변수도 LANG 변수와 동일한 인코딩을 사용해야합니다.

일반적으로 UTF-8 만 사용하도록 시스템을 구성해야합니다.

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


감사. 예, 가까운 시일 내에 UTF-8로 전환 할 계획입니다. 많은 파일 이름과 많은 텍스트 파일을 변환했습니다. iconv & convmv 구조로 ...
Craconia

0

이것은 당신의 필요를 벗어난 것일 수도 있지만 ....

그것은 RHEL5에서 밝혀졌으며, 아마도 이전에는 많은 매뉴얼 페이지가 어떻게 든 gd foresaken 이유에 대해 ascii-ized되었습니다. 즉, 원시 매뉴얼 페이지가 기본 문자 세트에서 7 비트 ASCII로 변환되었습니다. LC 및 LANG로 무엇을 하든지 latin1맨 페이지는 실제로 쓸모없는 맨 페이지를 생성합니다. 안에있는 모든 특수 (8 비트) 문자는 7 비트 자리 표시 자로 대체되었습니다 (보통 ??). 나는 이것이 재미 있다고 생각한다.

그러나 utf8이러한 매뉴얼 페이지 의 버전은 언어 별 디렉토리에 존재할 수 있습니다. 요령은 올바른 이름으로 요청하는 것입니다. 예를 들어 latin1은 실제로 iso_8859-1입니다. 매뉴얼 페이지를 작성하고 LANG 설정이 올 바르면 예상 한 것을 볼 수 있습니다. 매뉴얼 페이지는 언어 별 하위 디렉토리 ( en/man7/iso_8859-1.7)에 있습니다. 그러나 iso-8859-1어떤 이유로을 요청 하면 ASCII 버전을 얻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.