decode
Metoda ciągów unicode tak naprawdę nie ma żadnych wniosków na wszystkich (chyba że masz jakieś dane inne niż tekst w ciąg Unicode dla jakiegoś powodu - patrz niżej). Myślę, że jest tam głównie z powodów historycznych. W Pythonie 3 całkowicie go nie ma.
unicode().decode()
wykona niejawny kodowania z s
użyciem domyślnego ASCII) (kodek. Sprawdź to w ten sposób:
>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
>>> s.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
Komunikaty o błędach są dokładnie takie same.
Za str().encode()
to na odwrót - próbuje niejawny dekodowanie z s
z kodowaniem domyślnym:
>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
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)
Używany w ten sposób str().encode()
jest również zbędny.
Istnieje jednak inna aplikacja tej drugiej metody, która jest użyteczna: istnieją kodowania , które nie mają nic wspólnego z zestawami znaków, a zatem mogą być stosowane w znaczący sposób do ciągów 8-bitowych:
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
Masz jednak rację: dwuznaczne użycie „kodowania” w obu tych aplikacjach jest ... dziwne. Ponownie, z oddzielnymi byte
i string
typami w Pythonie 3, nie jest to już problemem.