Mam serwer gniazd, który powinien odbierać prawidłowe znaki UTF-8 od klientów.
Problem polega na tym, że niektórzy klienci (głównie hakerzy) wysyłają nad nim niewłaściwe dane.
Mogę z łatwością rozróżnić oryginalnego klienta, ale loguję do plików wszystkie przesłane dane, aby móc je później przeanalizować.
Czasami dostaję takie postacie, œ
które powodują UnicodeDecodeError
błąd.
Muszę być w stanie utworzyć ciąg UTF-8 z tymi znakami lub bez nich.
Aktualizacja:
W moim szczególnym przypadku usługa gniazda była MTA i dlatego oczekuję tylko otrzymania poleceń ASCII, takich jak:
EHLO example.com
MAIL FROM: <john.doe@example.com>
...
Logowałem to wszystko w JSON.
Potem niektórzy ludzie bez dobrych intencji postanowili sprzedać wszelkiego rodzaju śmieci.
Dlatego w moim konkretnym przypadku jest całkowicie okazywanie usuwania znaków spoza ASCII.
źródło
Odpowiedzi:
http://docs.python.org/howto/unicode.html#the-unicode-type
lub
Uwaga: Spowoduje to usunięcie (zignorowanie) znaków, które zwracają ciąg bez nich.
Dla mnie jest to idealny przypadek, ponieważ używam go jako ochrony przed danymi wejściowymi innymi niż ASCII, co nie jest dozwolone przez moją aplikację.
Alternatywnie: Użyj metody open z
codecs
modułu, aby wczytać plik:źródło
str.decode('cp1252').encode('utf-8')
'\xc0msterdam'
który zamienia się wu'\ufffdmsterdam'
zamieńopen(file_name, "rb")
a następnie zastosuj podejście Bena z powyższych komentarzyZmiana silnika z C na Python załatwiła sprawę.
Silnik to C:
Silnik to Python:
Brak błędów dla mnie.
źródło
csv
plik. Może to prowadzić doOutOfMemory
błędu lub automatycznego ponownego uruchomienia jądra notebooka. Powinieneś ustawićencoding
w tej sprawie.Ten rodzaj problemu pojawia się teraz, kiedy przeniosłem się do Python 3. Nie miałem pojęcia, że Python 2 po prostu paruje problemy z kodowaniem plików.
Znalazłem to miłe wyjaśnienie różnic i jak znaleźć rozwiązanie, gdy żadne z powyższych nie działało dla mnie.
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
Krótko mówiąc, aby Python 3 zachowywał się tak bardzo, jak to możliwe, użyj Python 2:
Jednak przeczytaj artykuł, nie ma jednego rozmiaru dla wszystkich rozwiązań.
źródło
źródło
used by default in the legacy components of Microsoft Windows in English and some other Western languages
Miałem ten sam problem
UnicodeDecodeError
i rozwiązałem go za pomocą tej linii. Nie wiem, czy to najlepszy sposób, ale mi się udało.źródło
pierwszy, używając get_encoding_type, aby uzyskać typ pliku kodowania:
drugi, otwieranie plików typu:
źródło
Na wypadek, gdyby ktoś miał ten sam problem. Używam vim z YouCompleteMe , nie udało mi się uruchomić ycmd z tym komunikatem o błędzie, co zrobiłem to:
export LC_CTYPE="en_US.UTF-8"
problem zniknął.źródło
export LC_CTYPE="en_US.UTF-8"
?Co możesz zrobić, jeśli chcesz zmienić plik, ale nie znasz jego kodowania? Jeśli wiesz, że kodowanie jest zgodne z ASCII i chcesz tylko zbadać lub zmodyfikować części ASCII, możesz otworzyć plik za pomocą procedury obsługi błędów surrogateescape:
źródło
Rozwiązałem ten problem, dodając
źródło