Jak usunąć znaki inne niż UTF-8 z pliku tekstowego


84

Mam kilka plików arabskich, angielskich i rosyjskich zakodowanych w utf-8. Próbując przetworzyć te pliki za pomocą skryptu Perla, pojawia się ten błąd:

Malformed UTF-8 character (fatal)

Ręczne sprawdzanie zawartości tych plików znalazłem w nich dziwne znaki. Teraz szukam sposobu, aby automatycznie usunąć te znaki z plików.

Czy w ogóle można to zrobić?




4
Co to są znaki inne niż UTF-8? Wszystkie znaki w dobrze sformułowanym łańcuchu UTF-8 to znaki UTF-8 (właściwie Unicode)! Niektóre z nich są zakodowane w UTF-8 w kilku kolejnych bajtach ....
Basile Starynkevitch

3
@BasileStarynkevitch: komunikat o błędzie wyraźnie wskazuje, że występuje zniekształcony znak UTF-8. Oznacza to, że pojawił się bajt, który nie może pojawić się jako część prawidłowego pliku UTF-8. To nie jest trudne; może to być bajt 0xC0 lub 0xC1, 0xF5..0xFF lub problem z sekwencjonowaniem bajtów, które w innym przypadku byłyby prawidłowe.
Jonathan Leffler

Odpowiedzi:


156

To polecenie:

iconv -f utf-8 -t utf-8 -c file.txt

wyczyści twój plik UTF-8, pomijając wszystkie nieprawidłowe znaki.

-f is the source format
-t the target format
-c skips any invalid sequence

11
„iconv -f utf-8 -t utf-8 -c plik.txt” na komputerze Mac. łącznik między „f” a „8”
Colin

1
Dogodnie można przekształcić zawartość schowka na Mac robi tak: pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy. Stworzyłem także przepływ pracy Alfreda z globalnym skrótem do usuwania wszystkich znaków specjalnych przez kierowanie ascii.
Lenar Hoyt,

1
W ten sposób powstał plik, który był dla mnie całkowicie pusty. Chcę tylko poinformować wszystkich, że jest to potencjalnie destrukcyjne i wykonać kopię zapasową pliku przed uruchomieniem tego na nim.
przeciwstawianie się

5
iconv -f utf-8 -t ascii//TRANSLITrozwiązał mój problem. Konwertuje kręcone cudzysłowy na proste.
Panika pułkownika

5
-odla innego pliku wyjściowego
codaamok

0

Twoja metoda musi czytać bajt po bajcie oraz w pełni rozumieć i doceniać mądrą bajtową konstrukcję znaków. Najprostszą metodą jest użycie edytora, który odczyta wszystko, ale tylko wypisze znaki UTF-8. Textpad to jeden wybór.


iconv nie jest dostępny w cygwin. Czy jest jakiś sposób, aby to zrobić w systemie Windows / Cygwin? Mam duży (ponad 100 000 wierszy) plik XML, który wymaga usunięcia nieprawidłowych znaków. Nie obchodzi mnie poprawny utf-8.
Ustawiłem

Ubuntu WSL w systemie Windows zawiera iconv
Kat Lim Ruiz

-4
cat foo.txt | strings -n 8 > bar.txt

wykona robotę.


10
Nie, to również zabije wiele prawidłowych znaków utf-8.
Zack Burt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.