[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 было извлечено…
URL: http://mail.pm.org/pipermail/moscow-pm/attachments/20080604/835e4fa1/attachment.html
Подробная информация о списке рассылки Moscow-pm