Um amigo colou um comando em uma sala de bate-papo do Slack que continha o personagem *
. Parece normal, *
mas não é:
$ uniprops '*'
uniprops: no character named ‹*›
Embora se eu rodar uniprops
no asterisco que recebo ao digitar na minha máquina, recebo:
$ 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
Também posso ver que não é um asterisco real passando por od
:
$ printf '*' | od -c
0000000 * 342 200 213
0000004
Enquanto o normal dá:
$ printf '*' | od -c
0000000 *
0000001
Aqui está o personagem misterioso um pouco maior:
*
E o asterisco normal (sim, eles parecem idênticos):
*
Portanto, uniprops
não sei o que é isso, e também não consigo encontrá-lo em http://www.fileformat.info/ . Eu sei que o amigo que o colou está no OS X (eu estou no Linux) e que funciona no sistema deles como um asterisco regular. Estou assumindo que o Slack mudou de alguma forma. Então, alguém tem alguma idéia do que esse personagem é?
Observe que você não pode copiar o personagem estranho diretamente da pergunta. Aparentemente, o mecanismo Stack Exchange remove os caracteres não imprimíveis à direita. Clique no link "editar" e copie a partir daí.
uniprops
é um pequeno script limpo incluído no Unicode::Tussle
módulo Perl que identifica e imprime informações sobre o personagem que você fornece.
fonte
ord("*")
sua string colada e a*
chave nativa e obtive o mesmo número para ambas (42).urxvt
, ele já é exibido como*<200b>
.'*\u200b'
também é exibido )Respostas:
A colagem falhou não por causa do asterisco, que é um asterisco perfeitamente regular, mas por causa do caractere Unicode U + 200B . Como o caractere é a
ZERO WIDTH SPACE
, ele não é exibido quando é copiado.Usando o código Python:
A função
uniconv
converte a sequência de entrada (nesse casou"'*'?"
) em seus equivalentes de página de código Unicode no formato hexadecimal. Ou
prefixo da sequência identifica a sequência como uma sequência Unicode.Consegui obter a saída:
Podemos ver claramente que
0x27
,0x2a
e0x3f
são os / valores ASCII Unicode hexadecimais para os personagens'
,*
e?
respectivamente. Isso deixa0x200b
, portanto, identificando o personagem.Observe que o código Python, quando colado no corpo, teve o caractere U + 200B removido pelo software Markdown da SE. Para obter o resultado esperado, é necessário copiá-lo diretamente do título usando a visualização Editar.
fonte
str
porhex
produzirá os pontos de código em hexadecimal, facilitando o reconhecimento ou a pesquisa.unicodedata
, com o qual você pode consultar os nomes dos personagens, categoria etc.Com a ajuda de @Rinzwind na sala de bate-papo Ask Ubuntu, descobri que o problema não é o personagem. Observe a saída de
od
:O
342 200 213
é uma representação octal de outro personagem e podemos usar este site para procurar:Então, na verdade, eu tinha dois caracteres unicode, o normal
*
e o espaço de largura zero.fonte
printf '\342\200\213' | uniname
. (uniname é a partir do pacote uniutils.)002A 200B
, para utf-82A E2 80 8B
para utf-16002A 200B
...