Как удалить символы, отличные от 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.