utf8 - unicode python 3




Quelle est la différence entre encoder/décoder? (5)

Il existe quelques encodages qui peuvent être utilisés pour coder de str à str ou d'unicode à unicode. Par exemple base64, hex ou même rot13. Ils sont répertoriés dans le module codecs .

Modifier:

Le message de décodage sur une chaîne unicode peut annuler l'opération de codage correspondante:

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

Le type retourné est str au lieu d'unicode ce qui est regrettable à mon avis. Mais quand vous ne faites pas d'encodage / décodage correct entre str et unicode, cela ressemble à un bordel de toute façon.

Je n'ai jamais été sûr de comprendre la différence entre le décodage str / unicode et le codage.

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

Je sais que unicode().encode() convertit les caractères Unicode en une chaîne d'octets en fonction d'un nom de codage donné.

Mais je ne comprends pas ce que str().encode() et unicode().decode() sont pour. Quelqu'un peut-il expliquer, et peut-être aussi corriger toute autre chose que je me suis trompé ci-dessus?

MODIFIER:

Plusieurs réponses donnent des informations sur ce que .encode fait sur une chaîne, mais personne ne semble savoir ce que .decode fait pour unicode.


La méthode de decode des chaînes Unicode n'a vraiment aucune application (sauf si vous avez des données non textuelles dans une chaîne Unicode pour une raison quelconque - voir ci-dessous). C'est principalement là pour des raisons historiques, je pense. En Python 3, il est complètement parti.

unicode().decode() effectuera un codage implicite de s utilisant le codec par défaut (ascii). Vérifiez ceci comme ceci:

>>> 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 l'inverse - il tente un décodage implicite de s avec l'encodage 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é de la sorte, str().encode() est également superflu.

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

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

Vous avez raison, cependant: l'utilisation ambiguë de "encoding" pour ces deux applications est ... awkard. Encore une fois, avec des types d' byte et de string séparés dans Python 3, ce n'est plus un problème.


Représenter une chaîne unicode comme une chaîne d'octets est un encodage . Utilisez 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 can't encode characters in position 0-5: 
    ordinal not in range(128)

En général, vous encodez une chaîne unicode chaque fois que vous devez l'utiliser pour l'E / S, par exemple, la transférer sur le réseau ou l'enregistrer dans un fichier disque.

Convertir une chaîne d'octets en une chaîne Unicode s'appelle le décodage . Utilisez unicode('...', encoding) ou '...'. Decode (encodage).

Exemple:

   >>> u'æøå'
   u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so
   >>> 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'

Vous décodez généralement une chaîne d'octets chaque fois que vous recevez des données de chaîne du réseau ou d'un fichier disque.

Je crois qu'il y a des changements dans la gestion d'unicode dans python 3, donc ce qui précède n'est probablement pas correct pour python 3.

Quelques bons liens:



mybytestring.encode (somecodec) est significatif pour ces valeurs de somecodec :

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

Je ne suis pas sûr de ce que le décodage d'un texte Unicode déjà décodé est bon pour. Essayer avec n'importe quel codage semble toujours essayer de coder avec l'encodage par défaut du système en premier.







python-2.x