Как обнаружить искаженные символы UTF

Я хочу обнаружить и заменить неправильные символы UTF-8 пустым пространством, используя Perl script, при загрузке данных с помощью SQL * Loader. Как я могу это сделать?

Ответ 1

Рассмотрим Python. Это позволяет расширять кодеки с помощью пользовательских обработчиков ошибок, поэтому вы можете заменить не подлежащие записи байты на что угодно.

import codecs
codecs.register_error('spacer', lambda ex: (u' ', ex.start + 1))
s = 'spam\xb0\xc0eggs\xd0bacon'.decode('utf8', 'spacer')
print s.encode('utf8')

Отпечатки:

spam  eggs bacon

Ответ 2

РЕДАКТИРОВАТЬ: (Убрал бит о загрузчике SQL, поскольку он больше не имеет значения.)

Одна из проблем будет заключаться в том, что считается "концом" некорректного символа UTF-8. Легко сказать, что незаконно, но это может быть не очевидно, когда начинается следующий юридический характер.

Ответ 3

RFC 3629 описывает структуру символов UTF-8. Если вы посмотрите на это, вы увидите, что довольно легко найти недопустимые символы, и что следующая граница символов всегда легко найти (это символ 128 и один из стартовых маркеров "длинный символ", с ведущими битами 110, 1110 или 11110).

Но BKB, вероятно, правильный - самый простой ответ - позволить perl сделать это за вас, хотя я не уверен, что делает Perl, когда он обнаруживает неправильный utf-8 с этим фильтром.