我想将Unicode头骨和交叉骨头添加到我的shell提示符(特别是' skull and crossbones ' (U+2620)),但我不知道让echo吐出它的魔法咒语,或任何其他4位Unicode字符。两位数的数字很简单。例如echo -e "\x55",。

除了下面的答案之外,还应该注意到,很明显,您的终端需要支持Unicode以使输出符合您的期望。Gnome-terminal在这方面做得很好,但它在默认情况下不一定是打开的。

在macOS的终端应用程序中,选择首选项->编码,并选择Unicode (UTF-8)。


当前回答

快速一行代码将UTF-8字符转换为3字节格式:

var="$(echo -n '☠' | od -An -tx1)"; printf '\\x%s' ${var^^}; echo

or

echo -n '☠' | od -An -tx1 | sed 's/ /\\x/g'  

两者的输出都是\xE2\x98\xA0,所以你可以反过来写:

echo $'\xe2\x98\xa0'   # ☠

其他回答

只需在shell脚本中输入“☠”。在正确的地区和支持unicode的控制台上,它可以正常打印:

$ echo ☠
☠
$

一个丑陋的“变通方法”是输出UTF-8序列,但这也取决于所使用的编码:

$ echo -e '\xE2\x98\xA0'
☠
$

在UTF-8中,它实际上是6个数字(或3个字节)。

$ printf '\xE2\x98\xA0'
☠

要检查它是如何被控制台编码的,使用hexdump:

$ printf ☠ | hexdump
0000000 98e2 00a0                              
0000003

我用这个:

$ echo -e '\u2620'
☠

这比搜索十六进制表示法要简单得多。我在我的shell脚本中使用它。这适用于侏儒术语和urxvt AFAIK。

printf内置(就像coreutils的printf一样)知道接受4位Unicode字符的\u转义序列:

   \uHHHH Unicode (ISO/IEC 10646) character with hex value HHHH (4 digits)

使用Bash 4.2.37(1)测试:

$ printf '\u2620\n'
☠

如果已知unicode字符的十六进制值

H="2620"
printf "%b" "\u$H"

如果已知unicode字符的十进制值

declare -i U=2*4096+6*256+2*16
printf -vH "%x" $U              # convert to hex
printf "%b" "\u$H"