La principale source de problèmes que j'ai eu à travailler avec des chaînes unicode, c'est quand vous mélangez codé en utf-8 avec chaînes unicode.
Considérons, par exemple, les scripts suivants.
two.py
# encoding: utf-8
name = 'helló wörld from two'
one.py
# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name + two.name
La sortie de l'exécution de python one.py
est:
Traceback (most recent call last):
File "one.py", line 5, in <module>
print name + two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
Dans cet exemple, two.name
est codé en utf-8 chaîne (pas unicode), car il n'a pas importer unicode_literals
, et one.name
est une chaîne unicode. Lorsque vous mélangez les deux, python essaie de décoder la chaîne codée (en supposant que c'est de l'ascii) et de le convertir au format unicode et échoue. Il pourrait fonctionner si vous n'avez print name + two.name.decode('utf-8')
.
La même chose peut se produire si vous encodez une chaîne et d'essayer de les mélanger plus tard.
Par exemple, cela fonctionne:
# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
Sortie:
DEBUG: <html><body>helló wörld</body></html>
Mais après l'ajout de l' import unicode_literals
il ne:
# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
Sortie:
Traceback (most recent call last):
File "test.py", line 6, in <module>
print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)
Il échoue en raison d' 'DEBUG: %s'
est une chaîne unicode et donc de python essaie de décoder html
. Un couple de façons de corriger l'impression sont de le faire) print str('DEBUG: %s') % html
ou print 'DEBUG: %s' % html.decode('utf-8')
.
J'espère que cela vous aide à comprendre le potentiel de pièges courants lors de l'utilisation de chaînes unicode.