你怎么回的4位数Unicode character在庆典?
-
03-07-2019 - |
题
我想添加Unicode骷髅对我shell(具体的'骷髅头'(U+2620)),但我找不出魔法咒语做出回吐或任何其他的4位数Unicode character.两位一个人是很容易的。例如,echo-e"\x55",.
除了下面的答案应该注意的是,很明显,你的终端需要支持Unicode输出什么你期望。gnome端不良好的工作,但这不一定是通过默认。
对mac os的终端应用程序转到偏好->编码和选择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:
e c h o CTRL + SHIFT + û 2 6 2 0 输入 输入
(第一个输入结束Unicode输入,第二个输入 echo
命令。)
信用:询问Ubuntu SE
这是一个完全内部的Bash实现,没有分叉,无限大小的Unicode字符。
fast_chr() {
local __octal
local __char
printf -v __octal '%03o' $1
printf -v __char \\这是一个完全内部的Bash实现,没有分叉,无限大小的Unicode字符。
─━│┃┄┅┆┇┈┉┊┋┌┍┎┏
┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟
┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯
┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿
╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏
═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟
╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯
╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿
▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏
▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟
■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯
▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿
◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●
◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟
◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯
◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿
输出是:
<*>_octal
REPLY=这是一个完全内部的Bash实现,没有分叉,无限大小的Unicode字符。
<*>
输出是:
<*>_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
输出是:
<*>只需输入“&#9760;”在你的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"
将使你的shell提示进入头骨和骨骼。
如果控制台接受,则这三个命令中的任何一个都会在控制台中打印您想要的字符UTF-8 字符(最新的字符):
echo -e "SKULL AND CROSSBONES (U+2620) \U02620"
echo
之后,您可以将实际字形(图像,字符)复制并粘贴到任何(启用UTF-8)文本编辑器。
如果你需要看看如何用UTF-8编码这样的Unicode代码点,请使用xxd(比od更好的十六进制查看器):
echo
或者,在HEX中避免错误:0xE2 0x98 0xA0。即,空格(HEX 20)和换行(Hex 0A)之间的值。
如果您想深入了解将数字转换为字符:查看此处!
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中避免错误:0xE2 0x98 0xA0。即,空格(HEX 20)和换行(Hex 0A)之间的值。
如果您想深入了解将数字转换为字符:查看此处!
(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。即,空格(HEX 20)和换行(Hex 0A)之间的值。
如果您想深入了解将数字转换为字符:查看此处!
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中避免错误:0xE2 0x98 0xA0。即,空格(HEX 20)和换行(Hex 0A)之间的值。
如果您想深入了解将数字转换为字符:查看此处!
在bash中打印Unicode字符以输出use \ x,\ u或\ U(第一个用于2位十六进制,第二个用于4位十六进制,第三个用于任何长度)
echo -e '\U1f602'
我想将它分配给变量使用$'...'语法
x=\U1f602'
echo $x
printf
内置(就像coreutils' printf
一样)知道 \ u
转义序列,它接受4位Unicode字符:
\uHHHH Unicode (ISO/IEC 10646) character with hex value HHHH (4 digits)
使用Bash 4.2.37(1)进行测试:
$ printf '\u2620\n'
☠
如果你不介意Perl单行:
$ perl -CS -E 'say "\x{2620}"'
☠
-CS
在输出上启用UTF-8解码,在输出上启用UTF-8编码。 -E
将下一个参数计算为Perl,并启用了 say
等现代功能。如果您不想在最后添加换行符,请使用 print
而不是 say
。
对不起对于恢复这个老问题。但是当使用 bash
有一个非常简单的方法来创建Unicode代码点从纯ASCII输入,这甚至 不叉 在所有:
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"
或倾倒的第一65536unicode代码点到stdout(需要不到2秒在我的机器。额外的空间是为了防止某些人物流入的每一个其他由于壳牌等宽字体):
for a in {0..65535}; do unicodes "$a"; printf ' '; done
或者告诉一点非常典型的父的故事(本需要Unicode2010年):
unicodes 0x1F6BC 32 43 32 0x1F62D 32 32 43 32 0x1F37C 32 61 32 0x263A 32 32 43 32 0x1F4A9 10
说明:
printf '\UXXXXXXXX'
打印出任何Unicode characterprintf '\\U%08x' number
印刷品\UXXXXXXXX
与数量转换为六角,这个然后被送到另一个printf
实际上打印出Unicode characterprintf
认识到八(0oct),十六(0xHEX)和小(0或数字开始1到9)为数字,所以你可以选择任何表示最适合printf -v var ..
收集的输出printf
进入一个变量, 没有叉子 (这大大加快了东西)local variable
是有不污染全球namespacelocal -n var=other
别名var
要other
, ,这样分配var
改变了other
.一个有趣的部分是,var
是当地的名字空间,同时other
是的一部分,全球命名空间。- 请注意,没有这样的东西
local
或global
空间bash
.变量保持在环境中,这始终是全球性的。地刚刚放走目前的价值,并恢复它在功能是左侧。其他职能从内的功能local
仍然会看到的"地方"的价值。这是一个根本不同的概念不是所有的常规范围的规则中找到其他语言(和什么bash
不是非常强大的,但可能导致错误如果你是个程序员,谁不知道那)。
- 请注意,没有这样的东西
基于Stack Overflow问题 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
☠
使用Python2 / 3单线程很容易:
$ python -c 'print u"\u2620"' # python2
$ python3 -c 'print(u"\u2620")' # python3
结果:
☠
以下列出了所有可用的unicode表情符号:
https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
示例:
echo -e "\U1F304"
🌄
要获取此字符的ASCII值,请使用hexdump
echo -e "🌄" | hexdump -C
00000000 f0 9f 8c 84 0a |.....|
00000005
然后使用以十六进制格式通知的值
echo -e "\xF0\x9F\x8C\x84\x0A"
🌄
如果已知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"