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

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

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


当前回答

根据Stack Overflow问题Unix cut,删除第一个令牌和https://stackoverflow.com/a/15903654/781312:

(octal=$(echo -n ☠ | od -t o1 | head -1 | cut -d' ' -f2- | sed -e 's#\([0-9]\+\) *#\\0\1#g')
echo Octal representation is following $octal
echo -e "$octal")

输出如下。

Octal representation is following \0342\0230\0240
☠

其他回答

对不起,我又提了这个老问题。但是在使用bash时,有一种非常简单的方法可以从纯ASCII输入创建Unicode码点,甚至根本没有分叉:

unicode() { local -n a="$1"; local c; printf -vc '\\U%08x' "$2"; printf -va "$c"; }
unicodes() { local a c; for a; do printf -vc '\\U%08x' "$a"; printf "$c"; done; };

如下所示使用它来定义某些代码点

unicode crossbones 0x2620
echo "$crossbones"

或者将前65536个unicode码点转储到stdout(在我的机器上耗时不到2秒。额外的空格是为了防止某些字符由于shell的monospace字体而相互流入):

for a in {0..65535}; do unicodes "$a"; printf ' '; done

或者讲一个非常典型的父母的故事(这需要Unicode 2010):

unicodes 0x1F6BC 32 43 32 0x1F62D 32 32 43 32 0x1F37C 32 61 32 0x263A 32 32 43 32 0x1F4A9 10

解释:

printf '\UXXXXXXXX' prints out any Unicode character printf '\\U%08x' number prints \UXXXXXXXX with the number converted to Hex, this then is fed to another printf to actually print out the Unicode character printf recognizes octal (0oct), hex (0xHEX) and decimal (0 or numbers starting with 1 to 9) as numbers, so you can choose whichever representation fits best printf -v var .. gathers the output of printf into a variable, without fork (which tremendously speeds up things) local variable is there to not pollute the global namespace local -n var=other aliases var to other, such that assignment to var alters other. One interesting part here is, that var is part of the local namespace, while other is part of the global namespace. Please note that there is no such thing as local or global namespace in bash. Variables are kept in the environment, and such are always global. Local just puts away the current value and restores it when the function is left again. Other functions called from within the function with local will still see the "local" value. This is a fundamentally different concept than all the normal scoping rules found in other languages (and what bash does is very powerful but can lead to errors if you are a programmer who is not aware of that).

快速一行代码将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'   # ☠

简单地使用Python2/3一行代码:

$ python -c 'print u"\u2620"'    # python2
$ python3 -c 'print(u"\u2620")'  # python3

结果:

如果已知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"

您可能需要将代码点编码为八进制,以便快速展开以正确解码它。

U+2620编码为UTF-8为E2 98 A0。

在Bash中,

export PS1="\342\230\240"

会让你的壳迅速变成头骨和骨头。