고쳐 쓰다:이는 파일 시스템 문제가 아닙니다.
나는 다음을 입력할 수 있었습니다:
$ 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.
bash
Mx는 기본적으로 어떤 것에 도 바인딩되지 않지만 ß
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
로케일을 C
UTF-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 로케일로 변경한 다음 재부팅하는 것이 도움이 될 수 있습니다. 이렇게 하면 로그인 처리 및 셸 실행을 담당하는 프로세스의 로케일이 변경됩니다.