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