[Moscow.pm] Передача данных скрипту

Oleg Alexeenkov proler на gmail.com
Ср Ноя 26 22:09:19 PST 2008


Здравствуйте, Vladimir.

Вы писали 27 ноября 2008 г., 3:17:13:

> 2008/11/27 Oleg Alexeenkov <proler на gmail.com>:
>> Здравствуйте, Vladimir.
>>
>> Вы писали 27 ноября 2008 г., 2:11:00:
>>
>>> 2008/11/27 Ruslan Zakirov <ruz на bestpractical.com>:
>>>> Может проще остаться с csv и предварительно его iconv'ертить в UTF-8
>>
>>> Лучше все-таки Encode'вертить :)
>>
>>
>> Ктонить делал бенчмарки енкоде-иконвы-ручного(tr///)?

> Во первых бенчмарк делать бессмысленно, т.к. ни tr ни iconv не дадут
> строк с флагом
> Во вторых tr - только для 1байтных кодировок, а ucs2 и utf8 относятся
> к многобайтовым.
Можно чуть усложнить и..
> Хоте конечно можно рассмотреть iconv+utf8::upgrade vs decode
Не всегда нужен флаг.
А если очень захотеть...

[да, я знаю что так делать нехорошо ;)]



      $config{'trans'}{'cp1251'} ||=
"\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xA8\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF\xB8\xB2\xB3\xAF\xBF\xAA\xBA";
      $config{'trans'}{'koi8-r'} ||=
"\xE1\xE2\xF7\xE7\xE4\xE5\xF6\xFA\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF2\xF3\xF4\xF5\xE6\xE8\xE3\xFE\xFB\xFD\xFF\xF9\xF8\xFC\xE0\xF1\xB3\xC1\xC2\xD7\xC7\xC4\xC5\xD6\xDA\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD2\xD3\xD4\xD5\xC6\xC8\xC3\xDE\xDB\xDD\xDF\xD9\xD8\xDC\xC0\xD1\xA3\xB6\xA6\xB7\xA7\xB4\xA4";
      $config{'trans'}{'iso8859-5'} ||=
"\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xA1\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF1\xA6\xF6\xA7\xF7\xA4\xF4";
      $config{'trans'}{'cp866'} ||=
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xF0\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF1\xF6\xF7\xF8\xF9\xF4\xF5";


sub cp_trans_count {    #v1
  my ( $cfrom, $cto, $string ) = @_;
  return $string if $cto eq $cfrom or !length($string) or !$cfrom or !$cto;
  return utf_trans( $cto, $string ) if $cfrom eq 'utf-8' and $config{'trans'}{$cto};
  return to_utf_trans( $cfrom, $string ) if $cto eq 'utf-8' and $config{'trans'}{$cfrom};
  my $cnt;
  if ( $config{'trans'}{$cfrom} and $config{'trans'}{$cto} ) {
    ( $cfrom, $cto ) = \( $config{'trans'}{$cfrom}, $config{'trans'}{$cto} );
    eval "\$cnt = \$string =~ tr/$$cfrom/$$cto/";
  }
  return wantarray ? ( $string, $cnt ) : $string;
}


sub utf_trans {
  my ( $cto, $string ) = @_;
  return if $cto eq 'utf-8';
  my ( $cnt, $cnt2 );
  $cnt += $string =~ s/\xD0\x81/\xF0/g;     # e
  $cnt += $string =~ s/\xD1\x91/\xF1/g;     # E
  $cnt += $string =~ s/\xD0\x84/\xF4/g;     # ukr beg
  $cnt += $string =~ s/\xD1\x94/\xF5/g;
  $cnt += $string =~ s/\xD0\x86/\xF6/g;
  $cnt += $string =~ s/\xD1\x96/\xF7/g;
  $cnt += $string =~ s/\xD0\x87/\xF8/g;
  $cnt += $string =~ s/\xD1\x97/\xF9/g;     # ukr end
  $cnt += $string =~ s/\xE2\x80\x94/-/g;    # -
  $cnt += $string =~ s/\xC2\xAB/"/g;        # <
  $cnt += $string =~ s/\xC2\xBB/"/g;        # >
  $cnt += $string =~ s/\xD1\x98/j/g;        #
  $cnt += $string =~ s/\xD0\xB9/\xA9/g;     # й
  $cnt += $string =~ s/\xD0([\x90-\xBF])/chr(ord($1)-16)/eg;
  $cnt += $string =~ s/\xD1([\x80-\x8F])/chr(ord($1)+96)/eg;
  ( $string, $cnt2 ) = cp_trans_count( 'cp866', $cto, $string );
  $cnt += $cnt2;
  $cnt += $string =~ s/\x21\x16/\xB9/g;
  return wantarray ? ( $string, $cnt ) : $string;
}

sub to_utf_trans {
  my ( $cfrom, $string ) = @_;
  return if $cfrom eq 'utf-8';
  my $cnt;
  #  $cnt += $string =~ s/\xE9/\xD0\xB9/g;                           # й
  $cnt += $string =~ s/\xAB/"/g;            # <
  $cnt += $string =~ s/\xBB/"/g;            # <
  ( $string, $cnt ) = cp_trans_count( $cfrom, 'cp866', $string );
  $cnt += $string =~ s/([\x80-\x88\x8A-\xA8\xAA-\xAF])/"\xD0".chr(ord($1)+16)/eg;
  $cnt += $string =~ s/([\xE0-\xE8\xEA-\xEF])/"\xD1".chr(ord($1)-96)/eg;
  $cnt += $string =~ s/\xF0/\xD0\x81/g;     # e
  $cnt += $string =~ s/\xF1/\xD1\x91/g;     # E
  $cnt += $string =~ s/\xF4/\xD0\x84/g;     # ukr beg
  $cnt += $string =~ s/\xF5/\xD1\x94/g;
  $cnt += $string =~ s/\xF6/\xD0\x86/g;
  $cnt += $string =~ s/\xF7/\xD1\x96/g;
  $cnt += $string =~ s/\xF8/\xD0\x87/g;
  $cnt += $string =~ s/\xF9/\xD1\x97/g;     # ukr end
  $cnt += $string =~ s/(?<!\xD0)\xB9/\x21\x16/g;    # №
  $cnt += $string =~ s/(?<!\xD0)\xA9/\xD0\xB9/g;    # й
  $cnt += $string =~ s/(?<!\xD0)\x89/\xD0\x99/g;    # Й
  $cnt += $string =~ s/(?<!\xD0)\xE9/\xD1\x89/g;    # щ
  $cnt += $string =~ s/(?<!\xD0)\x99/\xD0\xA9/g;    # Щ
  return wantarray ? ( $string, $cnt ) : $string;
}




-- 
С уважением,
 Oleg                          mailto:proler на gmail.com



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