Otrzymuję błąd z następującym wzorcem:
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: ordinal not in range(128)
Nie wiem, co to u'\ufeff'
jest, pojawia się, gdy przeglądam sieć. Jak mogę zaradzić tej sytuacji? Metoda .replace()
string na tym nie działa.
Odpowiedzi:
Znak Unicode
U+FEFF
jest znacznikiem kolejności bajtów lub BOM i służy do określania różnicy między kodowaniem big- i little-endian UTF-16. Jeśli zdekodujesz stronę internetową przy użyciu odpowiedniego kodeka, Python usunie ją za Ciebie. Przykłady:Zwróć uwagę, że
EF BB BF
jest to BOM zakodowany w UTF-8. Nie jest wymagany dla UTF-8, ale służy tylko jako podpis (zwykle w systemie Windows).Wynik:
Zwróć uwagę, że
utf-16
kodek wymaga obecności BOM, w przeciwnym razie Python nie będzie wiedział, czy dane są typu big- czy little-endian.źródło
Natknąłem się na to w Pythonie 3 i znalazłem to pytanie (i rozwiązanie ). Podczas otwierania pliku Python 3 obsługuje słowo kluczowe encoding, aby automatycznie obsługiwać kodowanie.
Bez tego zestawienie komponentów jest uwzględniane w wyniku odczytu:
Podając prawidłowe kodowanie, BOM jest pomijany w wyniku:
Tylko moje 2 centy.
źródło
Tym znakiem jest BOM lub „Byte Order Mark”. Zwykle jest odbierany jako kilka pierwszych bajtów pliku, informując Cię, jak interpretować kodowanie pozostałych danych. Możesz po prostu usunąć znak, aby kontynuować. Chociaż, ponieważ błąd mówi, że próbujesz przekonwertować na „ascii”, prawdopodobnie powinieneś wybrać inne kodowanie dla tego, co próbujesz zrobić.
źródło
Treść, którą skrobasz, jest zakodowana w Unicode, a nie w tekście ascii, i otrzymujesz znak, który nie jest konwertowany na ascii. Właściwe „tłumaczenie” zależy od tego, co uważała za oryginalną stronę internetową. Strona Unicode w Pythonie zawiera informacje o tym, jak to działa.
Próbujesz wydrukować wynik lub umieścić go w pliku? Błąd sugeruje, że zapisuje dane, które powodują problem, a nie je odczytuje. To pytanie jest dobrym miejscem do szukania poprawek.
źródło
Tutaj opiera się na odpowiedzi Marka Tolonena. Ciąg zawierał różne języki słowa „test”, które jest oddzielone znakiem „|”, więc widać różnicę.
Oto przebieg próbny:
Warto wiedzieć, że tylko oba
utf-8-sig
iutf-16
odzyskać oryginalny ciąg po obuencode
idecode
.źródło
Ten problem pojawia się w zasadzie, gdy zapisujesz kod Pythona w kodowaniu UTF-8 lub UTF-16, ponieważ python automatycznie dodaje jakiś znak specjalny na początku kodu (który nie jest wyświetlany przez edytory tekstu) w celu zidentyfikowania formatu kodowania. Ale kiedy próbujesz wykonać kod, wyświetla błąd składni w linii 1, tj. Początek kodu, ponieważ kompilator Pythona rozumie kodowanie ASCII . kiedy przeglądasz kod pliku za pomocą funkcji read () , możesz zobaczyć na początku zwracanego kodu '\ ufeff' . Najprostszym rozwiązaniem tego problemu jest po prostu zmiana kodowania z powrotem na kodowanie ASCII (w tym celu możesz skopiować kod do notatnika i zapisać go Pamiętaj! wybierz kodowanie ASCII ... Nadzieja to pomoże.
źródło