Nigdy nie byłem pewien, czy rozumiem różnicę między dekodowaniem i kodowaniem str / unicode.
Wiem, że dzieje się tak, str().decode()
gdy masz ciąg bajtów, o którym wiesz, że ma pewne kodowanie znaków, biorąc pod uwagę nazwę kodowania, zwróci ciąg Unicode.
Wiem, że unicode().encode()
konwertuje znaki Unicode na ciąg bajtów zgodnie z podaną nazwą kodowania.
Ale nie rozumiem po co str().encode()
i po co unicode().decode()
. Czy ktoś może wyjaśnić, a być może również poprawić wszystko, co popełniłem powyżej?
EDYTOWAĆ:
Kilka odpowiedzi podaje informacje o tym, co .encode
robi na łańcuchu, ale wydaje się, że .decode
nikt nie wie, co robi dla Unicode.
Odpowiedzi:
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 zs
użyciem domyślnego ASCII) (kodek. Sprawdź to w ten sposób:Komunikaty o błędach są dokładnie takie same.
Za
str().encode()
to na odwrót - próbuje niejawny dekodowanie zs
z kodowaniem domyślnym: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:
Masz jednak rację: dwuznaczne użycie „kodowania” w obu tych aplikacjach jest ... dziwne. Ponownie, z oddzielnymi
byte
istring
typami w Pythonie 3, nie jest to już problemem.źródło
.decode()
na łańcuchach Unicode mogą być przydatne np.,print u'\\u0203'.decode('unicode-escape')
print u'\\u0203'.encode('utf8').decode('unicode-escape')
codecs.decode(u'\\u0203', 'unicode-escape')
ascii
kodowania:\\u0203\u00e4'.encode('ascii').decode('unicode-escape')
.encode('ascii').decode('unicode-escape')
) nie zależy odsys.getdefaultencoding()
.Reprezentowanie ciągu Unicode jako ciągu bajtów jest nazywane kodowaniem . Zastosowanie
u'...'.encode(encoding)
.Przykład:
Zazwyczaj koduje się ciąg znaków Unicode za każdym razem, gdy trzeba go użyć do operacji we / wy, na przykład przesłać go przez sieć lub zapisać w pliku dyskowym.
Konwersja ciągu bajtów na ciąg Unicode jest znana jako dekodowanie . Użyj
unicode('...', encoding)
lub „...”. Dekodowanie (kodowanie).Przykład:
Zazwyczaj dekodujesz ciąg bajtów za każdym razem, gdy odbierasz dane ciągu z sieci lub z pliku dyskowego.
Wierzę, że w Pythonie 3 są pewne zmiany w obsłudze Unicode, więc powyższe prawdopodobnie nie jest poprawne dla Pythona 3.
Kilka dobrych linków:
źródło
anUnicode. kodowania ( „kodowania”) wyniki w ciąg obiektu i może być wywołana na obiekcie unicode
aString. dekodowanie („kodowanie”) powoduje powstanie obiektu Unicode i może być wywoływane z ciągu znaków zakodowanego w danym kodowaniu.
Kilka dodatkowych wyjaśnień:
Możesz utworzyć obiekt Unicode, który nie ma żadnego zestawu kodowania. Sposób, w jaki Python przechowuje je w pamięci, nie stanowi problemu. Możesz go przeszukiwać, dzielić i wywoływać dowolne funkcje manipulowania ciągami.
Ale przychodzi czas, kiedy chcesz wydrukować obiekt Unicode na konsoli lub w pliku tekstowym. Więc musisz go zakodować (na przykład - w UTF-8), wywołujesz kodowanie ('utf-8') i otrzymujesz ciąg z '\ u <someNumber>', który można doskonale wydrukować.
Następnie ponownie - chciałbyś zrobić coś przeciwnego - przeczytaj ciąg znaków zakodowany w UTF-8 i potraktuj go jako Unicode, więc \ u360 będzie jednym znakiem, a nie 5. Następnie dekodujesz ciąg (z wybranym kodowaniem) i zdobądź zupełnie nowy obiekt typu Unicode.
Na marginesie - możesz wybrać kodowanie zboczeńców, takie jak „zip”, „base64”, „rot”, a niektóre z nich będą konwertowane z łańcucha na łańcuch, ale uważam, że najczęstszym przypadkiem jest UTF-8 / UTF-16 i ciąg.
źródło
mybytestring.encode (somecodec) ma znaczenie dla następujących wartości
somecodec
:Nie jestem pewien, do czego służy dekodowanie już zdekodowanego tekstu Unicode. Próbowanie tego przy dowolnym kodowaniu wydaje się zawsze próbować najpierw zakodować z domyślnym kodowaniem systemu.
źródło
Istnieje kilka kodowań, których można użyć do dekodowania / kodowania od str do str lub od Unicode do Unicode. Na przykład base64, hex lub nawet rot13. Są one wymienione w module kodeków .
Edytować:
Komunikat dekodowania w łańcuchu Unicode może cofnąć odpowiednią operację kodowania:
Zwrócony typ to str zamiast Unicode, co moim zdaniem jest niefortunne. Ale kiedy nie wykonujesz właściwego kodowania / dekodowania między str i Unicode, i tak wygląda to na bałagan.
źródło
Prosta odpowiedź jest taka, że są one dokładnie przeciwne.
Komputer wykorzystuje bardzo podstawową jednostkę bajtu do przechowywania i przetwarzania informacji; nie ma to znaczenia dla ludzkich oczu.
Na przykład „\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87” jest reprezentacją dwóch chińskich znaków, ale komputer wie (to znaczy drukuj lub przechowuj) tylko chińskie znaki, gdy otrzymują słownik, aby ich szukać Chińskie słowo, w tym przypadku jest to słownik „utf-8”, i nie pokazałby poprawnie chińskiego słowa, jeśli spojrzysz na inny lub niewłaściwy słownik (przy użyciu innej metody dekodowania).
W powyższym przypadku komputer szuka słowa chińskiego
decode()
.A proces komputerowego zapisywania Chińczyków w pamięci komputera jest
encode()
.Zatem zakodowane informacje to nieprzetworzone bajty, a zdekodowane informacje to nieprzetworzone bajty i nazwa słownika, do którego się odwołuje (ale nie sam słownik).
źródło