你如何在Bash中回显一个4位的Unicode字符?

我想在我的shell提示符(特别是'SKULL和CROSSBONES'(U + 2620))中添加Unicode骷髅和交叉骨,但我无法弄清魔术咒语,使回声吐出来,或者任何其他的, 4位Unicode字符。 两位数字很容易。 例如,echo -e“\ x55”,。

除了下面的答案,应该指出的是,显然,你的terminal需要支持Unicode的输出是你所期望的。 gnome-terminal在这方面做得很好,但是默认情况下它不一定是打开的。 转到terminal – >设置字符编码,并selectUnicode(UTF-8)。

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

 $ print "\xE2\x98\xA0" ☠ 

要检查控制台如何编码,请使用hexdump:

 $ printf ☠ | hexdump 0000000 98e2 00a0 0000003 

只要你的文本编辑器可以处理Unicode(大概用UTF-8编码),你可以直接inputUnicode代码点。

例如,在Vim文本编辑器中,您将进入插入模式,然后按Ctrl + V + U ,然后按照4位hex数字(如果需要,填充零)input代码点号码。 所以你可以inputCtrl + V + U 2 6 2 0 。 请参阅: 将Unicode字符插入文档的最简单方法是什么?

在运行Bash的terminal上,您可以inputCTRL + SHIFT + U并键入所需字符的hex代码点。 在input过程中,你的光标应该显示下划线的u 。 input的第一个非数字结束input,并呈现该字符。 所以你可以使用以下命令在Bash中打印U + 2620:

e c h o CTRL + SHIFT + U 2 6 2 0 ENTER ENTER

(第一个input结束Unicodeinput,第二个inputecho命令。)

信用: 请问Ubuntu SE

 % echo -e '\u2620' ☠ 

这在Zsh(我已经检查版本4.3)和在Bash 4.2或更新版本中工作。

这是一个完全内部的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" ☠ 

这比searchhex表示法更容易…我在我的shell脚本中使用这个。 这对gnome-term和urxvt AFAIK有效。

您可能需要将代码点编码为八进制,以便及时扩展以正确解码。

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

所以在Bash,

 export PS1="\342\230\240" 

会让你的shell提示成为头骨和骨头。

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

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

用Bash 4.2.37(1)testing:

 $ printf '\u2620\n' ☠ 

如果控制台接受UTF-8字符(最新的字符),这三个命令中的任何一个都会在控制台中打印出你想要的字符:

 echo -e "SKULL AND CROSSBONES (U+2620) \U02620" echo $'SKULL AND CROSSBONES (U+2620) \U02620' printf "%b" "SKULL AND CROSSBONES (U+2620) \U02620\n" SKULL AND CROSSBONES (U+2620) ☠ 

之后,您可以将实际的字形(图像,字符)复制并粘贴到任何(支持UTF-8的)文本编辑器。

如果您需要了解如何使用UTF-8编码这样的Unicode代码点,请使用xxd(比od更好的hex查看器):

 echo $'(U+2620) \U02620' | xxd 0000000: 2855 2b32 3632 3029 20e2 98a0 0a (U+2620) .... That means that the UTF8 encoding is: e2 98 a0 

或者,以hex来避免错误:0xE2 0x98 0xA0。 也就是说,空间(hex20)和换行符(hex0A)之间的值。

如果你想深入潜水把数字转换为字符: 看看这里 !

如果你不介意Perl一行:

 $ perl -CS -E 'say "\x{2620}"' ☠ 

-CS在input上启用UTF-8解码,在输出上启用UTF-8编码。 -E将下一个参数作为Perl进行评估,使用诸如启用的现代function。 如果你不想在最后换行,可以使用print来代替say

基于堆栈溢出问题Unix切割,删除第一个令牌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 ☠ 

通过Python轻松实现:

 $ python -c 'print u"\u2620"' 

结果是:

  

如果unicode字符的hex值是已知的

 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"