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右一重引用符)である可能性があります。

代替文字が 1 つしか表示されないため、端末エミュレータが 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つも可能です。

おすすめ記事