我想将Unicode骷髅和交叉骨添加到我的shell提示符中(特别是'SKULL AND CROSSBONES'(U + 2620)),但我无法弄清楚魔法咒语使回声吐出它或任何其他, 4位Unicode字符.两位数的一个很容易.例如,echo -e"\ x55",.
除了下面的答案之外,应该注意的是,显然,您的终端需要支持Unicode才能使输出符合您的预期.gnome-terminal做得很好,但默认情况下不一定开启.
在macOS的终端应用程序上转到Preferences-> Encodings并选择Unicode(UTF-8).
在UTF-8中,它实际上是6位数(或3个字节).
$ printf '\xE2\x98\xA0' ?
要检查它是如何由控制台编码的,请使用hexdump:
$ printf ? | hexdump 0000000 98e2 00a0 0000003
% echo -e '\u2620' # \u takes four hexadecimal digits ? % echo -e '\U0001f602' # \U takes eight hexadecimal digits
这适用于Zsh(我已经检查过4.3版本)和Bash 4.2或更新版本.
只要您的文本编辑器可以处理Unicode(可能以UTF-8编码),您就可以直接输入Unicode代码点.
例如,在Vim文本编辑器中,您将进入插入模式并按Ctrl+ V+ U然后将代码点编号作为4位十六进制数字(如果需要,使用零填充).所以你要键入Ctrl+ V+ U 2 6 2 0.请参阅:将Unicode字符插入文档的最简单方法是什么?
在运行Bash的终端上,您可以键入CTRL+ SHIFT+ U并键入所需字符的十六进制代码点.在输入过程中,光标应显示带下划线u
.您键入的第一个非数字结束输入,并呈现该字符.因此,您可以使用以下方法在Bash中打印U + 2620:
echo CTRL+ SHIFT+U2620ENTERENTER
(第一个输入结束Unicode输入,第二个输入结束echo
命令.)
信用:询问Ubuntu SE
这是一个完全内部的Bash实现,没有分叉,无限大小的Unicode字符.
fast_chr() { local __octal local __char printf -v __octal '%03o' $1 printf -v __char \\$__octal REPLY=$__char } function unichr { local c=$1 # Ordinal of char local l=0 # Byte ctr local o=63 # Ceiling local p=128 # Accum. bits local s='' # Output string (( c < 0x80 )) && { fast_chr "$c"; echo -n "$REPLY"; return; } while (( c > o )); do fast_chr $(( t = 0x80 | c & 0x3f )) s="$REPLY$s" (( c >>= 6, l++, p += o+1, o>>=1 )) done fast_chr $(( t = p | c )) echo -n "$REPLY$s" } ## test harness for (( i=0x2500; i<0x2600; i++ )); do unichr $i done
产出是:
???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ???????????????? ????????????????
只需在shell脚本中加入"☠"即可.在正确的区域设置和启用Unicode的控制台上,它将打印得很好:
$ echo ? ? $
一个丑陋的"解决方法"是输出UTF-8序列,但这也取决于使用的编码:
$ echo -e '\xE2\x98\xA0' ? $
快速单行将UTF-8字符转换为3字节格式:
var="$(echo -n '?' | od -An -tx1)"; printf '\\x%s' ${var^^}; echo
我正在使用这个:
$ echo -e '\u2620' ?
这比搜索十六进制表示要容易得多......我在shell脚本中使用它.这适用于gnome-term和urxvt AFAIK.
您可能需要将代码点编码为八进制,以便快速扩展以正确解码它.
编码为UTF-8的U + 2620是E2 98 A0.
所以在Bash,
export PS1="\342\230\240"
会让你的贝壳提示进入头骨和骨头.
在bash中打印Unicode字符以输出,请使用\ x,\ u或\ U(第一个代表2位十六进制,第二个代表4位十六进制,第三个代表任意长度)
echo -e '\U1f602'
我想使用$'...'语法将其分配给变量
x=$'\U1f602' echo $x