2017-09-09 3 views
3

Pourquoi nous avons différentes représentations de chaînes orientées octets en Python 3? Ne suffira-t-il pas d'avoir une représentation unique au lieu de multiple?Python-3 et x Vs u Vs U dans le codage de chaîne et pourquoi

Pour le numéro de plage ASCII impression d'une chaîne montre une séquence commençant par \x:

In [56]: chr(128) 
Out[56]: '\x80' 

Dans une autre gamme de nombres, il Python utilise une séquence commençant par \u

In [57]: chr(57344) 
Out[57]: '\ue000' 

Mais les chiffres dans la la plus haute gamme, à savoir le nombre d'Unicode maximal à partir de maintenant, il utilise l'un des principaux \U:

In [58]: chr(1114111) 
Out[58]: '\U0010ffff' 

Répondre

4

Python vous donne une représentation de la chaîne et, pour les caractères non imprimables, utilise la séquence d'échappement la plus courte disponible.

\x80 est le même caractère que \u0080 ou \U00000080, mais \x80 est juste plus court. Pour chr(57344) la plus courte notation est \ue000, vous ne pouvez pas exprimer le même caractère avec \xhh, que la notation ne peut être utilisé pour les caractères jusqu'à \0xFF.

Pour certains caractères, il existe même des échappements d'une seule lettre, comme \n pour une nouvelle ligne, ou \t pour un onglet.

Python a plusieurs options de notation pour des raisons historiques et pratiques. Dans une chaîne octets vous ne pouvez créer des octets dans la plage 0 - 255, donc \xhh est utile et plus concis que d'avoir à utiliser \U000hhhhh partout où vous ne pouvez même pas utiliser toute la gamme disponible à cette notation, et \xhh et \n et les codes connexes sont familiers aux programmeurs d'autres langues.

+0

La même logique ne s'applique pas ici '\ U0010ffff'' et devrait plutôt être comme \ u10ffff ou' \ u10ffff ' – MaNKuR

+0

@MaNKuR: non, car la syntaxe '\ U' est une largeur fixe. Il faut 8 caractères hexadécimaux; et la syntaxe '\ u' prend 4. Si elles ont pris un nombre variable de caractères hexadécimaux, vous ne pourriez pas les suivre avec d'autres lettres ascii ou chiffres qui ont juste une signification hexadécimale mais ne font pas partie de la séquence d'échappement. –

+1

@MaNKuR: '\ U' est de 8 caractères hexadécimaux parce que la norme Unicode pourrait éventuellement être étendue pour avoir besoin de tous ces chiffres. Tout simplement parce que le codepoint maximum est '\ U0010FFFF' aujourd'hui ne signifie pas qu'une future mise à jour de la norme Unicode n'atteindra jamais' \ UFFFFFFFF'. –