Как проверить, действителен ли файл в формате UTF-8?
-
02-07-2019 - |
Вопрос
Я обрабатываю некоторые файлы данных, которые должны быть действительными в формате UTF-8, но это не так, что приводит к сбою синтаксического анализатора (не под моим контролем).Я хотел бы добавить этап предварительной проверки данных на правильность формата UTF-8, но пока не нашел утилиты, которая могла бы это сделать.
Есть веб-сервис в W3C, который, похоже, мертв, и я нашел проверку только для Windows инструмент который сообщает о недопустимых файлах UTF-8, но не сообщает, какие строки/символы нужно исправить.
Я был бы рад либо инструменту, который я могу использовать (в идеале кросс-платформенному), либо скрипту Ruby/Perl, который я могу сделать частью процесса загрузки данных.
Решение
Вы можете использовать GNU iconv:
$ iconv -f UTF-8 your_file -o /dev/null; echo $?
Или в более старых версиях iconv, например в macOS:
$ iconv -f UTF-8 your_file > /dev/null; echo $?
Команда вернет 0, если файл удалось преобразовать успешно, и 1, если нет.Кроме того, он распечатает смещение байта, в котором произошла неверная последовательность байтов.
Редактировать:Выходную кодировку указывать не обязательно, предполагается, что это UTF-8.
Другие советы
Используйте функции python и str.encode|decode.
>>> a="γεια"
>>> a
'\xce\xb3\xce\xb5\xce\xb9\xce\xb1'
>>> b='\xce\xb3\xce\xb5\xce\xb9\xff\xb1' # note second-to-last char changed
>>> print b.decode("utf_8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.5/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 6: unexpected code byte
Выброшенное исключение содержит запрошенную информацию в свойстве .args.
>>> try: print b.decode("utf_8")
... except UnicodeDecodeError, exc: pass
...
>>> exc
UnicodeDecodeError('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
>>> exc.args
('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
Вы можете использовать isutf8 из дополнительные утилиты коллекция.
$ apt-get install moreutils
$ isutf8 your_file
В сценарии оболочки используйте --quiet
переключитесь и проверьте статус выхода, который равен нулю для файлов с допустимым кодом utf-8.
Как насчет гну? значок v библиотека?Использование функции iconv():"Во входных данных обнаружена недопустимая многобайтовая последовательность.В этом случае он устанавливает errno в EILSEQ и возвращает (size_t)(-1).*inbuf остается указывающим на начало недопустимой многобайтовой последовательности».
РЕДАКТИРОВАТЬ:ох, я пропустил ту часть, где вам нужен язык сценариев.Но для работы в командной строке значок v Утилита должна проверить и вас.