Как мне очистить недопустимый UTF-8 в Perl?

Моя программа Perl берет текст из дискового файла в качестве входных данных, обертывает его в некоторый XML, а затем выводит в STDOUT. Номинально вводится UTF-8, но иногда в него вставлен мусор. Мне нужно очистить вывод так, чтобы не выдавались недопустимые октеты UTF-8, иначе последующий потребитель (Sphinx) взорвется.

По крайней мере, я хотел бы знать , если данные недействительный, поэтому я могу избежать его передачи; в идеале я мог бы удалить только ошибочные байты. Однако включение всех фатализмов, которые я могу найти, не совсем приводит меня к этому с помощью perl 5.12 (FWIW, используйте v5.12; используйте предупреждения qw (FATAL utf8); действует).

I У меня конкретно проблемы с последовательностью "\ xFE \ xBF \ xBE" . Если я создаю файл, содержащий только эти три байта ( perl -e 'print "\ xEF \ xBF \ xBE"'> bad.txt ), пытаюсь прочитать файл в режиме : encoding ( UTF-8) ошибки с utf8 «\ xFFFE» не отображается в Unicode , но только в версии 5.14.0. 5.12.3 и более ранние версии прекрасно читают и позже записывают эту последовательность. Я не уверен, откуда он получает \ xFFFE (незаконную обратную спецификацию), но, по крайней мере, жалоба соответствует Sphinx.

К сожалению, decode_utf8 ("\ xEF \ xBF \ xBE ", 1) не вызывает ошибок ниже 5.12 или 5.14. Я бы предпочел метод обнаружения, который не требовал уровня закодированного ввода-вывода, так как это оставит меня с сообщением об ошибке и невозможностью очистить необработанные октеты.

Я уверен, что есть другие последовательности, Мне нужно обратиться, но просто справиться с этим было бы для начала. Итак, мои вопросы: могу ли я надежно обнаруживать данные такого рода с помощью Perl до 5.14? Какая процедура подстановки может вообще преобразовать почти-UTF-8 в строгий UTF-8?

20
задан Adam Thomason 4 June 2011 в 02:49
поделиться