你如何在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"