Bash 쉘의 이상한 문자

Bash 쉘의 이상한 문자

때때로 이 도구나 bash 셸의 도구를 사용할 때 rm다음과 같은 이상한 문자가 표시됩니다.stat

root@server:~# rm -vr blah
removed directory: �blah�
root@server:~# 

지역 설정은 여기에서 볼 수 있습니다:

root@server:~# locale -a
C
C.UTF-8
en_US.utf8
POSIX
root@server:~# locale
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
root@server:~# 

그 이유는 무엇입니까?

답변1

이러한 문자는 (U+2018 왼쪽 작은따옴표) 및 (U+2019 오른쪽 작은따옴표)일 가능성이 높습니다.

대체 문자가 하나만 표시되므로 터미널 에뮬레이터가 UTF-8에 맞게 올바르게 구성되었을 수 있지만 사용 중인 글꼴에는 이러한 문자가 없습니다. 따라서 터미널은 글리프를 대체 문자로 사용합니다.

이 도우미를 사용하면 다음과 같습니다.

describe_non_ascii() {
  perl -Mcharnames=full -Mopen=locale -lpe '
   s{
      [^[:ascii:]]
   }{
      sprintf("{U+%04X: %s}", ord($&),  charnames::viacode(ord($&)))
   }gex'
}

나는 볼 수 있다:

$ rm -vr blah | describe_non_ascii
removed directory: {U+2018: LEFT SINGLE QUOTATION MARK}blah{U+2019: RIGHT SINGLE QUOTATION MARK}

UTF-8에서는 다음 문자가 각각 3바이트로 인코딩됩니다.

$ printf '\u2018\u2019' | hd
00000000  e2 80 98 e2 80 99                                 |......|
00000006

따라서 터미널이 UTF-8로 올바르게 구성되지 않은 경우 3개의 문자가 표시될 것으로 예상됩니다. 해당 바이트 중 터미널에서 예상하는 문자 집합의 문자가 없으면 3개도 가능합니다.

답변2

아마도 터미널의 인코딩일 것입니다.
예 퍼티 터미널을 사용하고 있는데 utf-8로 변경해야 합니다.

관련 정보