Un ami a collé une commande dans une salle de discussion Slack contenant le personnage *
. Cela ressemble à une normale *
mais n'est pas:
$ uniprops '*'
uniprops: no character named ‹*›
Tandis que si je cours uniprops
sur l'astérisque que je reçois en tapant sur ma machine, je reçois:
$ 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
Je peux aussi voir que ce n'est pas un astérisque réel en le passant od
:
$ printf '*' | od -c
0000000 * 342 200 213
0000004
Alors que la normale donne:
$ printf '*' | od -c
0000000 *
0000001
Voici le personnage mystère un peu plus grand:
*
Et l'astérisque normal (oui, ils ont l'air identique):
*
Donc, uniprops
je ne sais pas ce que c'est, et je ne le trouve pas non plus sur http://www.fileformat.info/ . Je sais que l'ami qui l'a collé est sous OS X (je suis sous Linux) et que cela fonctionne sur son système comme un astérisque normal. Je suppose que Slack l'a changé d'une manière ou d'une autre. Alors, est-ce que quelqu'un a une idée de ce que ce personnage est?
Notez que vous ne pouvez pas copier le caractère étrange directement à partir de la question. Apparemment, le moteur Stack Exchange supprime les derniers caractères non imprimables. Cliquez sur le lien "modifier" et copiez à partir de là.
uniprops
est un petit script soigné inclus dans le Unicode::Tussle
module Perl qui identifie et affiche des informations sur le caractère que vous lui donnez.
la source
ord("*")
pour votre chaîne collée et la*
clé native , et j'ai obtenu le même numéro pour les deux (42).urxvt
, il est déjà affiché comme*<200b>
.'*\u200b'
aussi)Réponses:
Le collage a échoué non pas à cause de l'astérisque, qui est un astérisque parfaitement normal, mais à cause du caractère Unicode U + 200B . Comme le caractère est un
ZERO WIDTH SPACE
, il ne s’affiche pas lorsqu’il est copié.En utilisant le code Python:
La fonction
uniconv
convertit la chaîne d'entrée (dans ce cas,u"'*'?"
) en leurs équivalents page de code Unicode au format hexadécimal. Leu
préfixe de la chaîne identifie la chaîne en tant que chaîne Unicode.J'ai pu obtenir le résultat:
On voit bien que
0x27
,0x2a
et0x3f
sont les valeurs hexadécimal ASCII / Unicode pour les caractères'
,*
et?
respectivement. Cela laisse0x200b
donc identifier le personnage.Notez que le code Python, une fois collé dans le corps, avait le caractère U + 200B supprimé par le logiciel Markdown de SE. Pour obtenir le résultat attendu, vous devez le copier directement à partir du titre à l'aide de la vue Modifier.
la source
str
parhex
affichera les points de code en hexadécimal, ce qui les rendra plus faciles à reconnaître ou à rechercher.unicodedata
, avec lequel vous pouvez interroger les noms de caractères, la catégorie, etc.Avec l'aide de @Rinzwind dans la salle de discussion Ask Ubuntu, j'ai compris que le problème n'était pas du tout le personnage. Notez le résultat de
od
:Le
342 200 213
est une représentation octale d’un autre personnage et nous pouvons utiliser ce site pour le rechercher:Donc, ce que j’avais réellement, c’était deux caractères unicode, l’
*
espace normal et un espace nul.la source
printf '\342\200\213' | uniname
. (Uniname est issu du paquet uniutils.)002A 200B
, pour utf-82A E2 80 8B
pour utf-16002A 200B
...