Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Можно использовать 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.
Используйте функции 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')
Как насчет гну библиотека iconv ? Используя iconv () функция: "С недопустимой многобайтовой последовательностью встречаются во входе. В этом случае это устанавливает errno на EILSEQ и возвраты (size_t) (-1). *inbuf является указывающим налево к началу недопустимой многобайтовой последовательности".
РЕДАКТИРОВАНИЕ: о - я пропустил часть, где Вы хотите язык сценариев. Но для работы командной строки, утилита iconv должна проверить для Вас также.