[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 было извлечено&hellip;
URL: http://mail.pm.org/pipermail/moscow-pm/attachments/20080604/a9047900/attachment-0001.html 


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