Друг вставил команду в чат-комнату Slack, в которой был персонаж *
. Это выглядит нормально, *
но не так:
$ uniprops '*'
uniprops: no character named ‹*›
Хотя, если я запускаю uniprops
звездочку, полученную при наборе текста на моей машине, я получаю:
$ uniprops '*'
U+002A ‹*› \N{ASTERISK}
\pP \p{Po}
All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
X_POSIX_Print Punctuation Unicode X_POSIX_Punct
Я также вижу, что это не настоящая звездочка, пропустив ее через od
:
$ printf '*' | od -c
0000000 * 342 200 213
0000004
В то время как нормальный дает:
$ printf '*' | od -c
0000000 *
0000001
Вот загадочный персонаж немного больше:
*
И обычная звездочка (да, они выглядят одинаково):
*
Итак, я uniprops
не знаю, что это такое, и я не могу найти его на http://www.fileformat.info/ . Я знаю, что друг, который вставил его, находится на OS X (я на Linux) и что он работает в их системе как обычная звездочка. Я предполагаю, что Слэк как-то изменил это. Итак, кто-нибудь знает, что это за персонаж?
Обратите внимание, что вы не можете скопировать странный символ непосредственно из вопроса. По-видимому, механизм Stack Exchange удаляет конечные непечатаемые символы. Нажмите на ссылку «Изменить» и скопируйте оттуда.
uniprops
это аккуратный маленький скрипт, включенный в Unicode::Tussle
модуль Perl, который идентифицирует и печатает информацию о персонаже, которого вы ему даете.
источник
ord("*")
для вашей вставленной строки и нативный*
ключ, и получил одинаковое число для обоих (42).urxvt
, он уже отображается как*<200b>
.'*\u200b'
тоже самое)Ответы:
Ошибка вставки произошла не из-за звездочки, которая является совершенно обычной звездочкой, а из-за символа Unicode U + 200B . Поскольку символ является символом
ZERO WIDTH SPACE
, он не отображается при копировании.Используя код Python:
Функция
uniconv
преобразует входную строку (в данном случаеu"'*'?"
) в их эквиваленты кодовой страницы Unicode в шестнадцатеричном формате.u
Префикс к строке идентифицирует строку в виде строки Unicode.Я был в состоянии получить вывод:
Мы ясно видим , что
0x27
,0x2a
и0x3f
являются ASCII / шестнадцатеричные значения Unicode для символов'
,*
и?
соответственно. Это оставляет0x200b
, следовательно, идентификации персонажа.Обратите внимание, что при вставке кода в код Python символ U + 200B был удален программным обеспечением SE Markdown. Чтобы получить ожидаемый результат, вам необходимо скопировать его непосредственно из заголовка с помощью представления «Изменить».
источник
str
наhex
будет выводить кодовые точки в шестнадцатеричном формате, что облегчает их распознавание или поиск.unicodedata
, с помощью которого вы можете запрашивать имена персонажей, категории и т. Д.С помощью @Rinzwind в чате Ask Ubuntu я понял, что проблема вовсе не в персонаже. Обратите внимание на вывод
od
:Это
342 200 213
восьмеричное представление другого персонажа, и мы можем использовать этот сайт для его поиска:Итак, на самом деле у меня было два символа Юникод, нормаль
*
и пробел нулевой ширины.источник
printf '\342\200\213' | uniname
. (uniname из пакета uniutils.)002A 200B
, для utf-82A E2 80 8B
для utf-16002A 200B
...