Comme d'autres l'ont déjà dit, unicode et utf-8 ne sont pas les mêmes. Utf-8 est l'un des nombreux encodages pour Unicode. Pensez à unicode
comme des chaînes unicode "non codées", tandis que les objets string
sont codés dans un codage particulier (malheureusement, les objets chaîne n'ont pas d'attribut qui vous indique comment ils sont codés).
val.encode("utf-8")
convertit cet objet unicode en objet chaîne encodé en utf-8.
En Python 2.6, cela est nécessaire car urllib
ne peut pas gérer unicode correctement.
>>> import urllib
>>> urllib.quote(u"")
''
>>> urllib.quote(u"ä")
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py:1216: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
res = map(safe_map.__getitem__, s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", line 1216, in quote
res = map(safe_map.__getitem__, s)
KeyError: u'\xe4'
>>> urllib.quote(u"ä".encode("utf-8"))
'%C3%A4'
3.x Python cependant, où toutes les chaînes sont unicode (Python 3 équivalent à une chaîne codée est un objet bytes
), il est plus nécessaire.
>>> import urllib.parse
>>> urllib.parse.quote("ä")
'%C3%A4'
Unicode n'est pas UTF-8. Ce sont des choses différentes, mais vous les verrez souvent discutées ensemble. Le lien dans la réponse d'ivo est une bonne référence pour commencer. –