zacznę tworząc zmienną string z niektórych non-ASCIIUTF-8 zakodowanych danych na nim:Dlaczego unicode() używa str() na moim obiekcie tylko bez podanego kodu?
>>> text = 'á'
>>> text
'\xc3\xa1'
>>> text.decode('utf-8')
u'\xe1'
Korzystanie unicode()
na nim podnosi błędy ...
>>> unicode(text)
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)
. .. ale jeśli znam kodowanie, mogę go użyć jako drugiego parametru:
>>> unicode(text, 'utf-8')
u'\xe1'
>>> unicode(text, 'utf-8') == text.decode('utf-8')
True
Teraz jeśli mam klasy, która zwraca ten tekst w sposobie __str__()
:
>>> class ReturnsEncoded(object):
... def __str__(self):
... return text
...
>>> r = ReturnsEncoded()
>>> str(r)
'\xc3\xa1'
unicode(r)
wydaje się używać str()
na nim, ponieważ podnosi ten sam błąd jak unicode(text)
powyżej:
>>> unicode(r)
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)
Do tej pory wszystko jest zgodnie z planem!
Ale nikt nie oczekiwać, unicode(r, 'utf-8')
nie będzie nawet próbować:
>>> unicode(r, 'utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: coercing to Unicode: need string or buffer, ReturnsEncoded found
Dlaczego? Dlaczego to niespójne zachowanie? Czy to błąd? jest to przeznaczone? Bardzo dziwne.
Myślę, że może nie wyraziłem się jasno. Wiem to. Co mam na myśli, to wiedzieć, dlaczego unicode (r) ma inne zachowanie niż unicode (r, 'utf-8') ??? – nosklo
Zachowanie jest dziwne, ponieważ próbuje dekodować jako ascii, jeśli nie przekazuję "utf-8". Ale jeśli przekazuję "utf-8", daje to inny błąd ... – nosklo