Je suis nouveau dans python3, venant de python2, et je suis un peu perdu avec les principes fondamentaux de l'unicode. J'ai lu quelques bons articles, qui ont rendu tout cela beaucoup plus clair, mais je vois qu'il y a 2 méthodes sur python 3, qui gèrent l'encodage et le décodage, et je ne suis pas sûr de celle à utiliser.
L'idée de Python 3 est donc que chaque chaîne est unicode, et peut être encodée et stockée dans des octets, ou décodée pour redevenir une chaîne unicode.
Mais il y a deux façons de le faire :u'something'.encode('utf-8')
générera b'something'
mais aussi bytes(u'something', 'utf-8')
.
Et b'bytes'.decode('utf-8')
semble faire la même chose que str(b'bytes', 'utf-8')
.
Ma question est la suivante : pourquoi y a-t-il deux méthodes qui semblent faire la même chose ? L'une est-elle meilleure que l'autre (et pourquoi ?) J'ai essayé de trouver la réponse à cette question sur Google, mais sans succès.
>>> original = '27'
>>> type(original)
<class 'str'>
>>> encoded = original.encode('utf-8')
>>> print(encoded)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded)
<class 'bytes'>
>>> encoded2 = bytes(original, 'utf-8')
>>> print(encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded2)
<class 'bytes'>
>>> print(encoded+encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x8127\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> decoded = encoded.decode('utf-8')
>>> print(decoded)
27
>>> decoded2 = str(encoded2, 'utf-8')
>>> print(decoded2)
27
>>> type(decoded)
<class 'str'>
>>> type(decoded2)
<class 'str'>
>>> print(str(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81', 'utf-8'))
27
>>> print(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'.decode('utf-8'))
27