bash shell 中的奇怪字符

bash shell 中的奇怪字符

有时,当我在 bash shell 中使用该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

它可能是您终端上的编码。
示例我使用 putty 终端,必须更改为 utf-8。

相关内容