Як видалити символи, що не містять UTF-8, із текстового файлу


84

У мене є купа арабських, англійських, російських файлів, кодованих в utf-8. Намагаючись обробити ці файли за допомогою сценарію Perl, я отримую таку помилку:

Malformed UTF-8 character (fatal)

Перевіряючи вміст цих файлів вручну, я виявив у них дивних символів. Зараз я шукаю спосіб автоматичного видалення цих символів із файлів.

Чи можна це зробити?


2
Може бути , це так само , як це: stackoverflow.com/questions/7656283 / ...
Олаф Dietsche

2
Будь ласка, зверніться за цим посиланням: unix.stackexchange.com/questions/6516/filtering-invalid-utf8
askmish

4
Що таке символи, що не стосуються UTF-8? Усі символи у добре сформованому рядку UTF-8 є символами UTF-8 (насправді Unicode)! Деякі з них кодуються UTF-8 у декількох послідовних байтах ....
Василь Старинкевич

3
@BasileStarynkevitch: у повідомленні про помилку чітко зазначено, що є неправильний символ UTF-8. Це означає, що з’явився байт, який не може з’явитися як частина дійсного файлу UTF-8. Це не важко; це може бути байт 0xC0 або 0xC1, або 0xF5..0xFF, або проблема послідовності з байтами, яка інакше була б дійсною.
Джонатан Леффлер

Відповіді:


156

Ця команда:

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

очистить ваш файл UTF-8, пропускаючи всі недійсні символи.

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

11
"iconv -f utf-8 -t utf-8 -c file.txt" на Mac. дефіс між 'f' та '8'
Колін

1
Зручно ви можете перетворити вміст буфера обміну на в Mac роблять так: pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy. Я також створив робочий процес Альфреда із загальним ярликом для вилучення всіх спеціальних символів шляхом націлювання ascii.
Ленар Хойт,

1
Це створило файл, який був для мене абсолютно порожнім. Просто хочу повідомити всіх, що це потенційно руйнівне, і створити резервну копію свого файлу, перш ніж запускати це на ньому.
протидія

5
iconv -f utf-8 -t ascii//TRANSLITвирішив мою проблему. Він перетворює фігурні лапки в прямі.
Полковник Панік

5
-oдля іншого вихідного файлу
codaamok

0

Ваш метод повинен читати байт за байтом і повністю розуміти та оцінювати байтову мудру конструкцію символів. Найпростіший метод - це використання редактора, який буде читати що завгодно, але лише виводити символи UTF-8. Текстова панель - один із варіантів.


iconv недоступний у cygwin. Чи є спосіб зробити це у Windows / Cygwin? У мене є великий (понад 100000 рядків) файл XML, який потребує видалення недійсних символів. Мені байдуже дійсне utf-8. Я встановив notepad ++ на utf-8, але навіть після збереження звідти я все одно отримую помилки в синтаксичному аналізаторі XML
mljm

ubuntu WSL для Windows, він поставляється з iconv
Kat Lim Ruiz

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.