Question

Je suis en train de comprendre comment Python 2.5: les chaînes unicode. Bien que maintenant je pense avoir une bonne connaissance de la façon dont je suis censé les traiter dans le code, je ne comprends pas bien ce qui se passe dans les coulisses, en particulier lorsque vous tapez des chaînes à l'invite de l'interpréteur.

python pre 3.0 a deux types de chaînes, à savoir: str (chaînes d'octets) et unicode, qui sont tous deux dérivés de basestring. Le type par défaut pour les chaînes est str.

Les objets de str ont aucune idée de leur codage réel, ils sont des octets juste. Soit vous avez codait une chaîne de caractères Unicode vous et donc savoir ce que l'encodage qu'ils sont, ou vous avez lu un flux d'octets dont vous savez coder également au préalable (indeally). Vous pouvez deviner l'encodage d'une chaîne d'octets dont le codage vous est inconnu, mais il est tout simplement pas un moyen fiable de déterminer cela. Votre meilleur pari est de décoder tôt, utiliser partout unicode dans votre code et encoder fin.

Très bien. Mais les chaînes tapés dans l'interpréteur sont en effet encodés pour vous derrière votre dos? A condition que ma compréhension de chaînes en Python est correct, ce qui est le python méthode / paramètre utilise pour prendre cette décision?

La source de ma confusion est les résultats différents que je reçois lorsque je tente la même chose sur l'installation de python de mon système, et sur la console python intégré de mon éditeur.

 # Editor (Sublime Text)
 >>> s = "La caña de España"
 >>> s
 'La ca\xc3\xb1a de Espa\xc3\xb1a'
 >>> s.decode("utf-8")
 u'La ca\xf1a de Espa\xf1a'
 >>> sys.getdefaultencoding()
 'ascii'

 # Windows python interpreter
 >>> s= "La caña de España"
 >>> s
 'La ca\xa4a de Espa\xa4a'
 >>> s.decode("utf-8")
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
     return codecs.utf_8_decode(input, errors, True)
 UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 5: unexpected code byte
 >>> sys.getdefaultencoding()
 'ascii'
Était-ce utile?

La solution

Permettez-moi d'la réponse de Ignacio: Dans les deux cas, il y a une couche supplémentaire entre Python et vous: dans un cas, il est Sublime Text et dans l'autre il est cmd.exe. La différence de comportement que vous voyez est pas dû à Python, mais par les différents codages utilisés par Sublime Text (utf-8, comme il semble) et cmd.exe (CP437).

Alors, lorsque vous tapez ñ, Sublime Text envoie '\xc3\xb1' à Python, alors que cmd.exe envoie \xa4. [Je simplyfing ici, en omettant les détails qui ne sont pas pertinents à la question.].

Pourtant, Python sait à ce sujet. De cmd.exe vous aurez probablement quelque chose comme:

>>> import sys
>>> sys.stdin.encoding
'cp437'

considérant que, dans Sublime Text vous obtenez quelque chose comme

>>> import sys
>>> sys.stdin.encoding
'utf-8'

Autres conseils

L'interprète utilise le codage pour la saisie de texte natif de l'invite de commande. Dans votre cas, il est CP437:

>>> print '\xa4'.decode('cp437')
ñ

Tu deviens confus parce que l'éditeur et l'interprète utilisent différents encodages eux-mêmes. L'interpréteur Python utilise votre système par défaut (dans ce cas, cp437), alors que votre éditeur utilise utf-8.

Remarque, la différence disparaît si vous spécifiez une chaîne de caractères Unicode, comme suit:

# Windows python interpreter
>>> s = "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s = u"La caña de España"
>>> s
u'La ca\xf1a de Espa\xf1a'

La morale de l'histoire? Encodages sont difficiles. Assurez-vous de savoir quel est l'encodage de vos fichiers source sont, ou jouez en toute sécurité en utilisant toujours la version échappée de caractères spéciaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top