182 votes

Quelle est la différence entre l’encodage/décodage ?

Je n'ai jamais été sûr que je comprends la différence entre str/unicode décoder et encoder.

Je sais qu' str().decode() est pour quand vous avez une chaîne d'octets que vous connaissez a un certain encodage des caractères, étant donné que le nom d'encodage il sera de retour une chaîne unicode.

Je sais qu' unicode().encode() convertit les caractères unicode en une chaîne d'octets selon un nom d'encodage.

Mais je ne comprends pas ce qu' str().encode() et unicode().decode() sont pour. Quelqu'un peut-il expliquer, et aussi, éventuellement, de corriger tout ce que j'ai eu tort ci-dessus?

EDIT:

Plusieurs réponses donner des infos sur ce qu' .encode sur une chaîne, mais personne ne semble savoir de quoi .decode n'a pour l'unicode.

106voto

hop Points 15423

L' decode méthode de chaînes unicode n'est pas vraiment toutes les applications (sauf si vous avez des non-données de texte dans une chaîne unicode pour une raison -- voir ci-dessous). C'est essentiellement pour des raisons historiques, je pense. En Python 3, il est complètement disparu.

unicode().decode() effectuera implicite de l' encodage de l' s à l'aide de la valeur par défaut (ascii) codec. Vérifiez cette façon:

>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

>>> s.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

Les messages d'erreur sont exactement les mêmes.

Pour str().encode() c'est le contraire, il tente implicitement de décodage d' s avec le codage par défaut:

>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)

Utilisé comme cela, str().encode() est également superflu.

Mais il est une autre application de cette dernière méthode qui est utile: il y a des codages qui n'ont rien à voir avec les jeux de caractères, et peuvent donc être appliquées à 8 chaînes de bits d'une manière significative:

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

Vous avez raison, cependant: l'ambiguïté de l'utilisation de "l'encodage" pour ces deux applications est... awkard. Encore une fois, avec distinct byte et string types de Python 3, ce n'est plus un problème.

70voto

codeape Points 38576

Pour représenter une chaîne unicode comme une chaîne d'octets est connu comme l'encodage. Utiliser u'...'.encode(encoding).

Exemple:

 >>> u'æøå'.encode('utf8')
'\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8\xc3\x83\xc2\xa5'
 >>> u'æøå'.encode('latin1')
'\xc3\xa6\xc3\xb8\xc3\xa5'
 >>> u'æøå'.encode('ascii')
 UnicodeEncodeError: 'ascii' codec ne peut pas encoder des caractères en position de 0 à 5: 
 ordinal pas in range(128)

Généralement, vous encoder une chaîne unicode chaque fois que vous devez utiliser pour IO, par exemple le transfert sur le réseau, ou l'enregistrer dans un fichier sur disque.

Pour convertir une chaîne d'octets en une chaîne unicode est connu comme le décodage. Utiliser unicode('...', encoding) ou '...'.décoder(encodage).

Exemple:

 >>> u'æøå'
 u'\xc3\xa6\xc3\xb8\xc3\xa5' # l'interprète imprime l'unicode objet comme
 >>> unicode('\xc3\xa6\xc3\xb8\xc3\xa5', 'latin1')
u'\xc3\xa6\xc3\xb8\xc3\xa5'
 >>> '\xc3\xa6\xc3\xb8\xc3\xa5'.decode('latin1')
u'\xc3\xa6\xc3\xb8\xc3\xa5'

Généralement, vous décoder une chaîne d'octets à chaque fois que vous recevez des données de chaîne à partir du réseau ou à partir d'un fichier disque.

Je crois qu'il y a quelques changements dans la gestion de l'unicode en python 3, de sorte que le ci-dessus est probablement pas correct pour python 3.

Quelques bons liens:

16voto

Abgan Points 2249

anUnicode.encode("encodage") entraîne une chaîne de caractères de l'objet et peut être appelée sur un objet unicode

aString.decode("encodage") entraîne une unicode objet et peut être appelée sur une chaîne de caractères, codés dans chaque encodage.


Quelques explications:

Vous pouvez créer certains unicode objet, qui n'ont pas de codage de jeu. La façon dont il est stocké par Python dans la mémoire n'est pas votre préoccupation. Vous pouvez rechercher, de le diviser et de les appeler à n'importe quelle chaîne de manipuler la fonction que vous souhaitez.

Mais il arrive un moment, quand vous voulez imprimer votre unicode objet de la console ou dans un fichier texte. Donc, vous avez à coder (par exemple - en UTF-8), vous appelez encode('utf-8') et vous obtenez une chaîne '\u<someNumber>' intérieur, ce qui est parfaitement imprimable.

Alors, encore une fois, vous aimeriez faire le contraire - lire une chaîne encodée en UTF-8, et la traiter comme une Unicode, donc le \u360 serait un personnage, pas 5. Ensuite, vous décoder une chaîne de caractères (avec encodage sélectionné) et obtenir de la marque nouvel objet de type unicode.

Juste une remarque: vous pouvez sélectionner certains pervers de codage, comme 'zip', 'base64', 'pourrir' et certains d'entre eux se convertir à partir de la chaîne à la chaîne, mais je crois que le cas le plus fréquent est celui qui implique UTF-8/UTF-16 et de la corde.

12voto

nosklo Points 75862

mybytestring.Encode(somecodec) est explicite pour ces valeurs de `` :

  • base64
  • bz2
  • zlib
  • hex
  • quopri
  • rot13
  • string_escape
  • uu

Je ne sais pas ce que décoder un texte unicode déjà décodé est bon pour. Essayer cela avec n’importe quel encodage semble toujours essayer d’encoder avec de codage par défaut le système tout d’abord.

8voto

Oli Points 5620

Vous devriez lire Python UnicodeDecodeError - suis malentendu Encoder. Ma compréhension de l’unicode dans le Python était beaucoup plus claire après avoir lu la réponse acceptée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X