Как удалить символы, отличные от UTF-8, из текстового файла

86

У меня есть куча файлов на арабском, английском и русском языках, закодированных в utf-8. Пытаясь обработать эти файлы с помощью сценария Perl, получаю такую ​​ошибку:

Malformed UTF-8 character (fatal)

Проверяя содержимое этих файлов вручную, я обнаружил в них странные символы. Сейчас ищу способ автоматического удаления этих символов из файлов.

Есть ли способ это сделать?

Хаким
источник
2
Может быть, это то же самое: stackoverflow.com/questions/7656283/…
Олаф Дитше
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, или проблема последовательности с байтами, которые в противном случае были бы действительными.
Джонатан Леффлер

Ответы:

159

Эта команда:

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'
Colin
1
Удобно вы можете преобразовать содержимое буфера обмена на в Mac делают так: pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy. Я также создал рабочий процесс Альфреда с глобальным ярлыком для удаления всех специальных символов с помощью таргетинга ascii.
Ленар Хойт
1
Это произвело для меня совершенно пустой файл. Просто хочу, чтобы все знали, что это может быть разрушительно, и сделать резервную копию своего файла, прежде чем запускать это на нем.
counterbeing
5
iconv -f utf-8 -t ascii//TRANSLITрешил мою проблему. Он преобразует фигурные кавычки в прямые.
Colonel Panic
5
-oдля другого выходного файла
codaamok
0

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

Чарльз Кннелл
источник
iconv недоступен в cygwin. Есть ли способ сделать это в windows / cygwin? У меня есть большой (более 100000 строк) XML-файл, из которого нужно удалить недопустимые символы. Меня не волнует действительный utf-8. Я установил для блокнота ++ значение utf-8, но даже после сохранения оттуда я все еще получаю ошибки в парсере XML
mljm
ubuntu WSL в Windows поставляется с iconv
Кэт Лим Руис
-4
cat foo.txt | strings -n 8 > bar.txt

сделаю свою работу.

атул джха
источник
10
Нет, это также убьет много действительных символов utf-8.
Zack Burt