[Moscow.pm] UTF8 ещё раз
Eugene Toropov
jt на aaanet.ru
Ср Июн 4 03:33:24 PDT 2008
Че-то я не понял. А вот это тогда зачем:
a.. $flag = utf8::is_utf8(STRING)
(Since Perl 5.8.1) Test whether STRING is in UTF-8 internally. Functionally the same as Encode::is_utf8().
a.. $flag = utf8::valid(STRING)
[INTERNAL] Test whether STRING is in a consistent state regarding UTF-8. Will return true is well-formed UTF-8 and has the UTF-8 flag on or if string is held as bytes (both these states are 'consistent'). Main reason for this routine is to allow Perl's testsuite to check that operations have left strings in a consistent state. You most probably want to use utf8::is_utf8() instead.
----- Original Message -----
From: Dmitry Simonov
To: Moscow.pm group
Sent: Wednesday, June 04, 2008 2:02 PM
Subject: [Moscow.pm] UTF8 ещё раз
Озадачился тут вопросом - определить вручную, является ли входной поток 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;
}
};
}
Понятно, что эта конструкция подлежит упрощению, но хотелось бы понять - насколько сама идея может считаться грациозной и изящной :)
С уважением ко всем, Д.С.
------------------------------------------------------------------------------
--
Moscow.pm mailing list
moscow-pm на pm.org | http://moscow.pm.org
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: http://mail.pm.org/pipermail/moscow-pm/attachments/20080604/a9047900/attachment-0001.html
Подробная информация о списке рассылки Moscow-pm