[Moscow.pm] UTF8 ещё раз

Dmitry Simonov dsimonov на gmail.com
Ср Июн 4 03:02:07 PDT 2008


Озадачился тут вопросом - определить вручную, является ли входной поток utf8
или не является. Вот в результате получился такой код:

my $is_this_utf8  = -1;
# Обрабатываем входной поток
while (<$input_file_handle>) {
    chomp;
    my $string = $_;
    my @strring_arr = split(//, $string);
    my $utf_flag = 0;
    next if ($is_this_utf8>0);
    for my $_char (@strring_arr) {
        last if ($is_this_utf8>-1);
        my $char = ord($_char);
        # начало последовательности utf8
        if ( $utf_flag==0 && ( 1<<7 | 1<<6 | $char ) == $char ) {
            $utf_flag=1;
        }
        # продолжение последовательности utf8
        elsif ( $utf_flag > 0 && $utf_flag<6 && ( 1<<7 | $char ) == $char &&
( 1<<6 | $char ) != $char ) {
            $utf_flag++;
            $is_this_utf8 = 1;
        }
        # начало новой последовательности utf8, после предыдущей
последовательности
        elsif ( $utf_flag>1 && ( 1<<7 | 1<<6 | $char ) == $char ) {
            $utf_flag=1;
            #$is_this_utf8 = 1;
        }
        # символ c опущенными лидирующими битами
        elsif ( $utf_flag==0 && ( 1<<7 | 1<<6 | $char ) != $char ) {
            $utf_flag=0;
        }
        # символ c опущенным лидирующим битом
        elsif ( $utf_flag==0 && ( 1<<7 | $char ) != $char ) {
            $utf_flag=0;
        }
        # символ после первых двух байт utf8-последовательности c опущенным
лидирующим битом
        elsif ( $utf_flag>1 && ( 1<<7 | $char ) != $char ) {
            $utf_flag=0;
        }
        else {
            $utf_flag = 0;
            $is_this_utf8 = 0;
        }
    };
}


Понятно, что эта конструкция подлежит упрощению, но хотелось бы понять -
насколько сама идея может считаться грациозной и изящной :)

С уважением ко всем, Д.С.
----------- следущая часть -----------
Вложение в формате HTML было извлечено&hellip;
URL: http://mail.pm.org/pipermail/moscow-pm/attachments/20080604/835e4fa1/attachment.html 


Подробная информация о списке рассылки Moscow-pm