Как проверить, действителен ли файл в формате UTF-8?

StackOverflow https://stackoverflow.com/questions/115210

Вопрос

Я обрабатываю некоторые файлы данных, которые должны быть действительными в формате 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 Утилита должна проверить и вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top