Kodowanie do UTF-8, następnie re - kodowanie do UTF-8. Python można to zrobić tylko wtedy, gdy uprzednio dekoduje ponownie na Unicode, ale musi użyć kodek domyślny ASCII:
>>> u'ñ'
u'\xf1'
>>> u'ñ'.encode('utf8')
'\xc3\xb1'
>>> u'ñ'.encode('utf8').encode('utf8')
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)
Nie przechowywać kodowanie; pozostaw kodowanie do UTF-8 zamiast do ostatniej możliwej chwili. Łącz zamiast wartości Unicode.
Można użyć str.join()
(lub raczej unicode.join()
) tutaj, aby złączyć te trzy wartości z kresek pomiędzy:
nombre = u'-'.join(fabrica, sector, unidad)
return nombre.encode('utf-8')
ale nawet tutaj kodowania może być zbyt wcześnie.
Zasada kciuka: dekodowanie w momencie otrzymania wartości (jeśli nie są to wartości Unicode dostarczone przez API), koduj tylko wtedy, gdy musisz (jeśli docelowy interfejs API nie obsługuje bezpośrednio wartości Unicode).
Możliwy duplikat [Python - 'ascii' codec nie może dekodować bajt] (http://stackoverflow.com/questions/ 9644099/python-ascii-codec-cant-decode-byte) – bummi