48 votes

Quel est ce caractère : "*" ?

Un ami a collé une commande dans un Slack chat room qui contenait le personnage * . Cela ressemble à un * mais ne l'est pas :

$ uniprops '*'
uniprops: no character named ‹*›

Alors que si je cours uniprops sur l'astérisque que j'obtiens en tapant sur ma machine, j'obtiens :

$ 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 qu'il ne s'agit pas d'un astérisque réel en le faisant passer par 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 sont identiques) :

*

Ainsi, uniprops ne sait pas ce que c'est, et je ne peux pas le trouver sur le site de la http://www.fileformat.info/ soit. Je sais que l'ami qui l'a collé est sous OS X (je suis sous Linux) et qu'il fonctionne sur son système comme un astérisque normal. Je suppose que Slack l'a modifié d'une manière ou d'une autre. Alors, quelqu'un a-t-il une idée de ce qu'est ce caractère ?

Notez que vous ne pouvez pas copier le caractère bizarre directement à partir de la question. Apparemment, le moteur de Stack Exchange supprime les caractères non imprimables à la fin. Cliquez sur le lien "edit" et copiez à partir de là.


<code>uniprops</code> est un petit script soigné, inclus dans le fichier <code>Unicode::Tussle</code> Module Perl qui identifie et imprime des informations sur le caractère que vous lui donnez.

71voto

March Ho Points 1122

Le collage a échoué non pas à cause de l'astérisque, qui est un astérisque tout à fait normal, mais à cause de la mention Caractère Unicode U+200B . Comme le personnage est un ZERO WIDTH SPACE il ne s'affiche pas lorsqu'il est copié.

Utilisation du code Python :

stro=u"'*'?"
def uniconv(text):
    return " ".join(hex(ord(char)) for char in text)
uniconv(stro)

La fonction uniconv convertit la chaîne d'entrée (dans ce cas, u"'*'?" ) dans leurs équivalents de page de code Unicode au format hexadécimal. Les u identifie la chaîne comme une chaîne Unicode.

J'ai pu obtenir la sortie :

0x27 0x2a 0x200b 0x27 0x3f

Nous voyons clairement que 0x27 , 0x2a y 0x3f sont les valeurs ASCII/Unicode hexadécimales des caractères ' , * y ? respectivement. Il reste donc 0x200b identifiant ainsi le personnage.

Notez que le code Python, une fois collé dans le corps du texte, a été amputé du caractère U+200B par le logiciel Markdown de SE. Pour obtenir le résultat escompté, il faut le copier directement depuis le titre en utilisant la vue Edition.

27voto

Mohsin Points 11

Avec l'aide de @Rinzwind dans la salle de discussion Ask Ubuntu, j'ai compris que le problème ne venait pas du tout du caractère. Notez la sortie de od :

$ printf '*' | od -c
0000000   * 342 200 213
0000004

En 342 200 213 est une représentation octale d'un autre caractère et nous pouvons utiliser ce site pour le vérifier :

Character                                  
Character name                              ZERO WIDTH SPACE
Hex code point                              200B
Decimal code point                          8203
Hex UTF-8 bytes                             E2 80 8B
Octal UTF-8 bytes                           342 200 213
UTF-8 bytes as Latin-1 characters bytes     â <80> <8B>

J'avais donc en fait deux caractères unicode, le caractère normal * et un espace de largeur nulle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X