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

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

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

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

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

$ printf "\u2660"

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

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

$ printf "\u1F0A1"

打印符号Ἂ1而不是黑桃 A

答案1

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

printf解释 ISO C 99 中引入的两种字符语法: \u对于 16 位 Unicode (ISO/IEC 10646) 字符,指定为四个十六进制数字呵呵\U对于 32 位 Unicode 字符,指定为八个十六进制数字哈哈哈哈printf根据LC_CTYPE区域设置输出 Unicode 字符。此语法无法指定 U+0000…U+009F、U+D800…U+DFFF 范围内的 Unicode 字符,U+0024 ($)、U+0040 (@) 和 U+0060 (`) 除外。

Bash 手册中指定了类似的内容ANSI C 引用echo:

\uHHHH
值为十六进制值的 Unicode (ISO/IEC 10646) 字符呵呵呵呵(一到四位十六进制数字)

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

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

# printf "\u2660 \u1F0A1 \U1F0A1\n"
♠ Ἂ1 

答案2

Muru 的回答是完全正确的,但只是为了澄清一点:

当您打印 时\u1F0A1,它被解释为十六位 Unicode escape \u1F0A,后跟文字字符1(因为\u采用以下内容字符,不多也不少)。 U+1F0A 然后给出,一个带有几个变音符号的希腊字母(希腊大写字母 Alpha 与 Psili 和 Varia,准确地说)。

如果您想要 Unicode 转义中超过 16 位,则需要使用\U,它需要 8 个字符的十六进制值:\U0001F0A1将为您提供扑克牌。

相关内容