我正在使用 Adobe 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
将为您提供扑克牌。