ASCII가 아닌 문자는 더 이상 bash에 표시되지 않습니다.

ASCII가 아닌 문자는 더 이상 bash에 표시되지 않습니다.

고쳐 쓰다:이는 파일 시스템 문제가 아닙니다.

나는 다음을 입력할 수 있었습니다:

$ echo kødpålæg

그러나 이제 bash/zsh는 다음과 같이 변경합니다.

bash$ echo kddddddddplg
zsh$ echo k<c3><b8>dp<c3><a5>l<c3><a6>g

cat아무 문제 없이 "kødpålæg"를 실행하고 입력 할 수 있습니다 .

$ cat
kødpålæg
kødpålæg

이 환경에는 이 모든 것이 포함됩니다.

$ locale   
LANG=C
LANGUAGE=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

그리고 여기:

$ locale 
LANG=da_DK.utf8
LANGUAGE=da_DK.utf8
LC_CTYPE="da_DK.utf8"
LC_NUMERIC="da_DK.utf8"
LC_TIME="da_DK.utf8"
LC_COLLATE="da_DK.utf8"
LC_MONETARY="da_DK.utf8"
LC_MESSAGES="da_DK.utf8"
LC_PAPER="da_DK.utf8"
LC_NAME="da_DK.utf8"
LC_ADDRESS="da_DK.utf8"
LC_TELEPHONE="da_DK.utf8"
LC_MEASUREMENT="da_DK.utf8"
LC_IDENTIFICATION="da_DK.utf8"
LC_ALL=da_DK.utf8

csh'kødpålæg'를 변경하지 마세요.

"kødpålæg"를 입력할 수 있도록 원래 동작을 복원하려면 어떻게 해야 합니까?

다음 중 하나를 실행하면 이전 동작이 생성됩니다.

LC_ALL=en_GB.utf-8 luit
LC_ALL=da_DK.utf-8 luit
LC_ALL=en_GB.iso88591 luit
LC_ALL=da_DK.iso88591 luit

하지만 해당 단일 세션에만 해당됩니다.

이것:

$ od -An -vtx1
ø

다음을 제공합니다:

 c3 b8 0a

따라서 Konsole에서 bash로의 입력은 UTF8인 것으로 보입니다.

$ konsole --version
QCoreApplication::arguments: Please instantiate the QApplication object first
Qt: 5.5.1
KDE Frameworks: 5.18.0
Konsole: 15.12.3

$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ zsh --version
zsh 5.1.1 (x86_64-ubuntu-linux-gnu)

$ dpkg -l csh
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name              Version       Architecture  Description
+++-=================-=============-=============-========================================
ii  csh               20110502-2.1u amd64         Shell with C-like syntax

답변1

귀하의 터미널이 잘못 구성되어 일부 단일 바이트 문자 세트(아마도 ISO8859-1 또는 ISO8859-15)로 문자를 보내고 표시하고 있을 가능성이 높습니다. 표시되는 예제 문자가 로케일의 문자 세트가 아니라는 점을 고려하면 됩니다.

일반적으로 C 로캘에는 ø, å, 문자가 없으며 æ이러한 문자(0xf8, 0xe5, 0xe6)의 ISO8859-1(5) 인코딩은 UTF-8에서 유효한 문자를 형성하지 않습니다. readline이나 zle과 같은 라인 편집기는 커서를 올바르게 배치할 수 있도록 표시 열을 구성하는 바이트 수를 알아야 하기 때문에 이를 문자로 디코딩해야 합니다.

또한 대부분의 시스템에서 ASCII를 사용하는 C 로케일에서는 ASCII 에 비트 8이 설정된 문자가 없으므로 비트 8은 bash의미 로 해석됩니다 Meta. 0xF8은 Meta+x(0x78 (x) | 0x80) 으로 이해됩니다. 왜냐하면 이것이 Alt+x일부 터미널에서 on 또는 off로 보내는 것이기 때문입니다 Meta+x.

bashMx는 기본적으로 어떤 것에 도 바인딩되지 않지만 ßM-_로 이해되어 마지막 단어가 삽입됩니다. 다음 방법으로 끌 수 있습니다:

bind 'set convert-meta off'

이와 같은 쉘은 csh문자가 여러 바이트로 구성되거나 단일 열 너비 이외의 다른 것을 차지할 수 있다는 사실조차 알기에는 너무 오래되었으므로 신경 쓰지 않습니다.

이 이론을 테스트하려면 다음을 실행하세요.

od -An -vtx1

그런 다음 이 문자를 입력하고 ^D^D어떤 인코딩이 표시되는지 확인하세요. 0xf8 이 보이면 ø제가 옳다는 뜻입니다. UTF-8 인코딩인 0xc3 0xb8이 보이면 ø제가 틀렸다는 뜻입니다.

또는 로캘을 다음으로 변경하고 da_DK.iso88591( locale -a시스템에서 로캘의 정확한 이름을 확인) 더 잘 작동하는지 확인하세요.

이제 터미널이 이러한 문자의 잘못된 인코딩을 보내는 이유는 문자 집합 iso8859-1을 사용하는 로케일에서 시작되었기 때문일 수 있습니다. 어쩌면 로케일을 무시하고 특정 문자 집합을 사용하도록 구성되었을 수도 있습니다.문자 집합또는코딩구성에서). 또는 ssh로케일이 문자 집합으로 ISO8859-1(5)을 사용하는 다른 시스템에서 입력 할 수도 있습니다 .

UTF-8 터미널에서 다음 명령을 실행하면 동작을 재현할 수 있습니다.

LC_ALL=en_GB.iso885915 luit

그런 다음 내부적으로 luit로케일을 CUTF-8 로케일로 변경하고 ASCII가 아닌 문자를 입력하십시오.

답변2

테스트 cat결과 터미널 연결이 8비트로 깨끗한 것으로 나타났습니다. 따라서 이것은 가능한 로케일 문제인 것 같습니다.

선택한 로캘 "da_DK.utf8"이 있는지 확인하려면 실행하세요 locale -a. 목록에 없고 Debian/Ubuntu 제품군의 시스템을 사용하는 경우 주석을 제거 /etc/locale.gen하고 locale-gen루트로 실행해야 할 수도 있습니다.

또한 일부 셸 버전에서는 로케일을 동적으로 전환할 수 없지만 여전히 로케일 설정을 사용합니다.원래 상위 프로세스에서 상속됨. 이 경우 실행은 LC_CTYPE=da_DK.UTF-8 bash해당 특정 세션 중에 원하는 동작만 복원합니다. 이 경우 시스템 기본 로케일을 지원되는 UTF-8 로케일로 변경한 다음 재부팅하는 것이 도움이 될 수 있습니다. 이렇게 하면 로그인 처리 및 셸 실행을 담당하는 프로세스의 로케일이 변경됩니다.

관련 정보