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

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

64
задан Csaba 17 October 2018 в 16:04
поделиться

3 ответа

Можно использовать 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.

87
ответ дан Richard Gomes 24 November 2019 в 15:54
поделиться

Используйте функции str.encode|decode и Python.

>>> 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')
9
ответ дан tzot 24 November 2019 в 15:54
поделиться

Как насчет гну библиотека iconv ? Используя iconv () функция: "С недопустимой многобайтовой последовательностью встречаются во входе. В этом случае это устанавливает errno на EILSEQ и возвраты (size_t) (-1). *inbuf является указывающим налево к началу недопустимой многобайтовой последовательности".

РЕДАКТИРОВАНИЕ: о - я пропустил часть, где Вы хотите язык сценариев. Но для работы командной строки, утилита iconv должна проверить для Вас также.

4
ответ дан AShelly 24 November 2019 в 15:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: