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ć?

Hakim
źródło
2
Może to to samo: stackoverflow.com/questions/7656283/…
Olaf Dietsche
2
Proszę odnieść się do tego linku: unix.stackexchange.com/questions/6516/filtering-invalid-utf8
askmish
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
Palantir
źródło
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.

Charles KnNell
źródło
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ę.

atul jha
źródło
10
Nie, to również zabije wiele prawidłowych znaków utf-8.
Zack Burt