Как бороться с недопустимыми символами UTF-8 в веб-приложении Perl? - PullRequest
2 голосов
/ 12 августа 2011

Как работать с недопустимыми последовательностями UTF-8 в данных из внешнего файла / внешней команды, какие данные используются для генерации HTML (в веб-приложении Perl)?

В настоящее время я запускаю to_utf8() на каждом фрагменте данных; Эта подпрограмма обнаруживает, что данные являются недействительными UTF-8, и возвращается к кодировке 'latin1':

use utf8;
use Encoding;
binmode STDOUT, ':utf8';

sub to_utf8 {
    my $str = shift;
    return undef unless defined $str;
    if (utf8::valid($str)) {
        utf8::decode($str);
        return $str;
    } else {
        return decode($fallback_encoding, $str, Encode::FB_DEFAULT);
    }
}

Пожалуйста, исправьте меня, если этот код неверен.

(фрагмент) рекомендуемой установки в Perl Unicode Essentials из Материалы Тома Кристиансена для OSCON 2011 - это

use utf8;
use open qw( :encoding(UTF-8) :std );

Как получить что-то похожее на то, что у меня есть, используя что-то вроде выше? Я бы предпочел автоматическую обработку Unicode, а не помнить, чтобы пометить все выходные строки из внешних команд и файлов с помощью to_utf8 ().

Данные взяты из внешних файлов или выводятся из внешних команд, и они должны быть в UTF-8, но из-за ошибок пользователя иногда не совпадают.

1 Ответ

3 голосов
/ 12 августа 2011

Вы можете написать собственный слой ввода-вывода, который выполняет «магическое» декодирование.

Обычно слои ввода-вывода (например, :utf8) пишутся в XS, но основной модуль PerlIO :: via (см. http://search.cpan.org/perldoc?PerlIO::via) позволяет использовать для этого perl-код.

...