Я использую Arch Linux с простым терминалом, использующим шрифт Adobe Source Code Pro. Мой язык правильно установлен LANG=en_US.UTF-8
.
Я хочу напечатать символы Unicode, представляющие игральные карты, на мой терминал. Я использую Википедию для справки .
Символы Юникода для карточных мастей работают нормально. Например, выдача
$ printf "\u2660"
печатает черное сердце на экране.
Однако у меня проблемы с конкретными игральными картами. Выдача
$ printf "\u1F0A1"
печатает символ Ἂ1
вместо туза пик 🂡. Что не так?
Эта проблема сохраняется на нескольких терминалах (urxvt, xterm, termite) и на всех шрифтах, которые я пробовал (DejaVu, Inconsolata).
Ответы:
help printf
Относится кprintf(1)
интерпретируемым escape-последовательностям, а документация для GNU printf гласит:Нечто подобное указано в руководстве по Bash для цитирования ANSI C и
echo
:Короче говоря:
\u
не для 5 шестнадцатеричных цифр. Это\U
:источник
Ответ Муру совершенно правильный, но только для пояснения:
Когда вы печатаете
\u1F0A1
, это интерпретируется как шестнадцатеричный код Unicode\u1F0A
, за которым следует буквальный символ1
(поскольку он\u
принимает следующие четыре символа, не больше и не меньше). Затем U + 1F0A даетἊ
греческую альфу с парой диакритических знаков ( точнее , греческая заглавная буква альфа с псили и варией ).Если вам нужно более шестнадцати битов в вашем побеге Юникода, вам нужно использовать
\U
, что занимает шестнадцатеричное значение шестнадцати символов:\U0001F0A1
даст вам игральную карту.источник
\U0001F0A1
на самом деле более портативный, чем\U1F0A1
. Это отдельнаяprintf
утилита GNU, которая впервые представила эти\uXXXX
/\UXXXXXXXX
последовательности, и она требует 4 цифры для\u
и 8 для\U
. Другиеprintf
реализации, такие как встроенная оболочка GNU, ksh93 и zsh, более слабые. В любом случаеprintf '\u/\U'
это не POSIX. POSIX, однако, будет указывать zsh$'\U1F0A1'
и не будет требовать все 8 цифр.\uxxxx
это до 4 -х цифр и\Uxxxxxxxx
составляет до 8 цифр. Обратите внимание, что Unicode теперь ограничен кодовыми точками от 0 до 0x10FFFF (ограничение, введенное UTF16), поэтому кодовые точки никогда не будут иметь более 6 цифр (все\U123456789
равно будет интерпретироваться как символ кодовой точки 0x12345678, за которой следует код «9
сбой»). Спецификация POSIX для$'\u\U'
еще не завершена (см. Austingroupbugs.net/view.php?id=249 ). В более раннем варианте они требовали все 4/8 цифр, но это изменилось позже (по моей просьбе).