为什么某些 unicode 字符不会打印到我的终端?

Bri*_*ick 16 bash fonts unicode printf

我正在使用 Adob​​e Source Code Pro 字体通过简单终端运行 Arch Linux。我的语言环境正确设置为LANG=en_US.UTF-8.

我想将代表扑克牌的 Unicode 字符打印到我的终端。我正在使用维基百科作为参考

卡片套装的 Unicode 字符工作正常。例如,发行

$ printf "\u2660"
Run Code Online (Sandbox Code Playgroud)

在屏幕上打印一个黑色的心。

但是,我在使用特定的扑克牌时遇到了问题。发行

$ printf "\u1F0A1"
Run Code Online (Sandbox Code Playgroud)

打印符号?1而不是黑桃 A。怎么了?

这个问题在多个终端(urxvt、xterm、termite)和我尝试过的每种字体(DejaVu、Inconsolata)中仍然存在。

mur*_*uru 28

help printf遵循printf(1)解释的转义序列,GNU printf 的文档说:

printf解释 ISO C 99 中引入的两种字符语法: \u对于 16 位 Unicode (ISO/IEC 10646) 字符,指定为四个十六进制数字hhhh,以及\U对于 32 位 Unicode 字符,指定为八个十六进制数字hhhhhhhhprintf根据LC_CTYPE语言环境输出 Unicode 字符。此语法不能指定 U+0000…U+009F、U+D800…U+DFFF 范围内的 Unicode 字符,但 U+0024 ($)、U+0040 (@) 和 U+0060 (`) 除外.

在 Bash 手册中为ANSI C Quoting指定了类似的内容,并且echo

\uHHHH
Unicode (ISO/IEC 10646) 字符,其值为十六进制值HHHH(一到四个十六进制数字)

\UHHHHHHHH
Unicode (ISO/IEC 10646) 字符,其值为十六进制值HHHHHHHH(一到八个十六进制数字)

简而言之:\u不适用于 5 个十六进制数字。它是\U

# printf "\u2660 \u1F0A1 \U1F0A1\n"
? ?1 
Run Code Online (Sandbox Code Playgroud)