当前位置:  开发笔记 > 编程语言 > 正文

你如何回应Bash中的4位Unicode字符?

如何解决《你如何回应Bash中的4位Unicode字符?》经验,为你挑选了9个好方法。

我想将Unicode骷髅和交叉骨添加到我的shell提示符中(特别是'SKULL AND CROSSBONES'(U + 2620)),但我无法弄清楚魔法咒语使回声吐出它或任何其他, 4位Unicode字符.两位数的一个很容易.例如,echo -e"\ x55",.

除了下面的答案之外,应该注意的是,显然,您的终端需要支持Unicode才能使输出符合您的预期.gnome-terminal做得很好,但默认情况下不一定开启.

在macOS的终端应用程序上转到Preferences-> Encodings并选择Unicode(UTF-8).



1> vartec..:

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

$ printf '\xE2\x98\xA0'
?

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

$ printf ? | hexdump
0000000 98e2 00a0                              
0000003


确实如此.我发现我使用的是`LANG = C`而不是`LANG = en_US.UTF-8`.现在我在Gnome的终端正确显示符号......真正的终端(tty1-6)仍然没有.
您还可以使用`$'...'`语法将编码字符放入变量中而不使用`$(...)`捕获子shell,以便在本身不解释转义序列的上下文中使用:`skull = $'\ xE2\x98\xA0'`
对于那些尝试hexdump的人:`0000000 f0 9f 8d ba`转换为`\ xf0\x9f\x8d\xba`.示例echo:`echo -e"\ xf0\x9f\x8d\xba"`.
我的输出" "而不是☠......为什么?
关于hexdump的另一件事:在我的机器上,答案中的第二个命令输出'0000000 98e2 00a0`.当然`0000000`只是一个不重要的偏移量,但它转换为`\ xe2\x98\xa0`后的字节,因为机器使用小端字节顺序.
@trusktr:你没有使用UTF-8终端
如果您的bash可以输出下面的字符,请转到:http://unicode-table.com/en/#2591然后将其复制粘贴到您的脚本中,玩得开心.

2> Juliano..:
% echo -e '\u2620'     # \u takes four hexadecimal digits
?
% echo -e '\U0001f602' # \U takes eight hexadecimal digits

这适用于Zsh(我已经检查过4.3版本)和Bash 4.2或更新版本.


在Bash 4.2中添加了对\ u的支持.
当我这样做时,它就会吐出来.
@Flimm使用大写U:`echo -e'\ U1f602'`有效,你也可以这样使用变量:`x = $'\ U1f602'`.试试吧!`echo $ x`
对不起,忘了说我用的是zsh.
不适用于我,Mac OS 10.14.2,bash(GNU bash,版本3.2.57(1)-发行版(x86_64-apple-darwin18))。它只是打印出输入-$ echo -e'\ u2620'<enter>只是打印出:\ u2620

3> RobM..:

只要您的文本编辑器可以处理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的终端,只有当你在GTK +**环境下运行它时,就像Gnome一样.

4> Orwellophile..:

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

产出是:

????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????
????????????????



5> Joachim Saue..:

只需在shell脚本中加入"☠"即可.在正确的区域设置和启用Unicode的控制台上,它将打印得很好:

$ echo ?
?
$

一个丑陋的"解决方法"是输出UTF-8序列,但这也取决于使用的编码:

$ echo -e '\xE2\x98\xA0'
?
$



6> 小智..:

快速单行将UTF-8字符转换为3字节格式:

var="$(echo -n '?' | od -An -tx1)"; printf '\\x%s' ${var^^}; echo


UTF-8字符可以是1-4字节序列
我不会调用上面的示例*quick*(带有11个命令及其参数)...此外,它只处理3个字节的UTF-8字符`(UTF-8字符可以是1,2或3个字节).这有点短,适用于1-3 +++字节:`printf"\\\ x%s"$(printf'☠'| xxd -p -c1 -u)`....*xxd*作为'vim-common'包的一部分发货
好神人.考虑:`codepoints(){printf'U +%04x \n'$ {@ /#/ \'}; }; 代码点A R☯z` ...享受

7> Metal3d..:

我正在使用这个:

$ echo -e '\u2620'
?

这比搜索十六进制表示要容易得多......我在shell脚本中使用它.这适用于gnome-term和urxvt AFAIK.


遗憾的是,这在OS X上不起作用.:/
@masukomi如果你知道如何使用brew,你可以安装一个更新的bash并使用它.使用升级后的bash时,上面的mac终端上工作正常.

8> cms..:

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

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

所以在Bash,

export PS1="\342\230\240"

会让你的贝壳提示进入头骨和骨头.



9> user2622016..:

在bash中打印Unicode字符以输出,请使用\ x,\ u或\ U(第一个代表2位十六进制,第二个代表4位十六进制,第三个代表任意长度)

echo -e '\U1f602'

我想使用$'...'语法将其分配给变量

x=$'\U1f602'
echo $x

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有