Как обнаружить неправильно сформированные символы UTF - PullRequest
11 голосов
/ 15 октября 2008

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

Ответы [ 3 ]

4 голосов
/ 15 октября 2008

Рассмотрим 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
1 голос
/ 15 октября 2008

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

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

1 голос
/ 15 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...