時々、このツールまたは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つも可能です。