<p>только вот производительность подобных решений оставляет желать сильно лучшего. я даже использовал модуль типа Lingvo::RU::Detect, реализованный подобным образом. после отключения скорость работы выросла в 4 раза, и я думаю что подобные вещи не слишком приемлемы.<br>
</p><p></p><div class="gmail_quote">27 ноября 2008 г. 9:09 пользователь Oleg Alexeenkov <span dir="ltr"><<a href="mailto:proler@gmail.com">proler@gmail.com</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Здравствуйте, Vladimir.<br>
<br>
Вы писали 27 ноября 2008 г., 3:17:13:<br>
<div class="Ih2E3d"><br>
> 2008/11/27 Oleg Alexeenkov <<a href="mailto:proler@gmail.com">proler@gmail.com</a>>:<br>
>> Здравствуйте, Vladimir.<br>
>><br>
>> Вы писали 27 ноября 2008 г., 2:11:00:<br>
>><br>
>>> 2008/11/27 Ruslan Zakirov <<a href="mailto:ruz@bestpractical.com">ruz@bestpractical.com</a>>:<br>
>>>> Может проще остаться с csv и предварительно его iconv'ертить в UTF-8<br>
>><br>
>>> Лучше все-таки Encode'вертить :)<br>
>><br>
>><br>
>> Ктонить делал бенчмарки енкоде-иконвы-ручного(tr///)?<br>
<br>
> Во первых бенчмарк делать бессмысленно, т.к. ни tr ни iconv не дадут<br>
> строк с флагом<br>
> Во вторых tr - только для 1байтных кодировок, а ucs2 и utf8 относятся<br>
> к многобайтовым.<br>
</div>Можно чуть усложнить и..<br>
<div class="Ih2E3d">> Хоте конечно можно рассмотреть iconv+utf8::upgrade vs decode<br>
</div>Не всегда нужен флаг.<br>
А если очень захотеть...<br>
<br>
[да, я знаю что так делать нехорошо ;)]<br>
<br>
<br>
<br>
$config{'trans'}{'cp1251'} ||=<br>
"\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";<br>
$config{'trans'}{'koi8-r'} ||=<br>
"\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";<br>
$config{'trans'}{'iso8859-5'} ||=<br>
"\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";<br>
$config{'trans'}{'cp866'} ||=<br>
"\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";<br>
<br>
<br>
sub cp_trans_count { #v1<br>
my ( $cfrom, $cto, $string ) = @_;<br>
return $string if $cto eq $cfrom or !length($string) or !$cfrom or !$cto;<br>
return utf_trans( $cto, $string ) if $cfrom eq 'utf-8' and $config{'trans'}{$cto};<br>
return to_utf_trans( $cfrom, $string ) if $cto eq 'utf-8' and $config{'trans'}{$cfrom};<br>
my $cnt;<br>
if ( $config{'trans'}{$cfrom} and $config{'trans'}{$cto} ) {<br>
( $cfrom, $cto ) = \( $config{'trans'}{$cfrom}, $config{'trans'}{$cto} );<br>
eval "\$cnt = \$string =~ tr/$$cfrom/$$cto/";<br>
}<br>
return wantarray ? ( $string, $cnt ) : $string;<br>
}<br>
<br>
<br>
sub utf_trans {<br>
my ( $cto, $string ) = @_;<br>
return if $cto eq 'utf-8';<br>
my ( $cnt, $cnt2 );<br>
$cnt += $string =~ s/\xD0\x81/\xF0/g; # e<br>
$cnt += $string =~ s/\xD1\x91/\xF1/g; # E<br>
$cnt += $string =~ s/\xD0\x84/\xF4/g; # ukr beg<br>
$cnt += $string =~ s/\xD1\x94/\xF5/g;<br>
$cnt += $string =~ s/\xD0\x86/\xF6/g;<br>
$cnt += $string =~ s/\xD1\x96/\xF7/g;<br>
$cnt += $string =~ s/\xD0\x87/\xF8/g;<br>
$cnt += $string =~ s/\xD1\x97/\xF9/g; # ukr end<br>
$cnt += $string =~ s/\xE2\x80\x94/-/g; # -<br>
$cnt += $string =~ s/\xC2\xAB/"/g; # <<br>
$cnt += $string =~ s/\xC2\xBB/"/g; # ><br>
$cnt += $string =~ s/\xD1\x98/j/g; #<br>
$cnt += $string =~ s/\xD0\xB9/\xA9/g; # й<br>
$cnt += $string =~ s/\xD0([\x90-\xBF])/chr(ord($1)-16)/eg;<br>
$cnt += $string =~ s/\xD1([\x80-\x8F])/chr(ord($1)+96)/eg;<br>
( $string, $cnt2 ) = cp_trans_count( 'cp866', $cto, $string );<br>
$cnt += $cnt2;<br>
$cnt += $string =~ s/\x21\x16/\xB9/g;<br>
return wantarray ? ( $string, $cnt ) : $string;<br>
}<br>
<br>
sub to_utf_trans {<br>
my ( $cfrom, $string ) = @_;<br>
return if $cfrom eq 'utf-8';<br>
my $cnt;<br>
# $cnt += $string =~ s/\xE9/\xD0\xB9/g; # й<br>
$cnt += $string =~ s/\xAB/"/g; # <<br>
$cnt += $string =~ s/\xBB/"/g; # <<br>
( $string, $cnt ) = cp_trans_count( $cfrom, 'cp866', $string );<br>
$cnt += $string =~ s/([\x80-\x88\x8A-\xA8\xAA-\xAF])/"\xD0".chr(ord($1)+16)/eg;<br>
$cnt += $string =~ s/([\xE0-\xE8\xEA-\xEF])/"\xD1".chr(ord($1)-96)/eg;<br>
$cnt += $string =~ s/\xF0/\xD0\x81/g; # e<br>
$cnt += $string =~ s/\xF1/\xD1\x91/g; # E<br>
$cnt += $string =~ s/\xF4/\xD0\x84/g; # ukr beg<br>
$cnt += $string =~ s/\xF5/\xD1\x94/g;<br>
$cnt += $string =~ s/\xF6/\xD0\x86/g;<br>
$cnt += $string =~ s/\xF7/\xD1\x96/g;<br>
$cnt += $string =~ s/\xF8/\xD0\x87/g;<br>
$cnt += $string =~ s/\xF9/\xD1\x97/g; # ukr end<br>
$cnt += $string =~ s/(?<!\xD0)\xB9/\x21\x16/g; # №<br>
$cnt += $string =~ s/(?<!\xD0)\xA9/\xD0\xB9/g; # й<br>
$cnt += $string =~ s/(?<!\xD0)\x89/\xD0\x99/g; # Й<br>
$cnt += $string =~ s/(?<!\xD0)\xE9/\xD1\x89/g; # щ<br>
$cnt += $string =~ s/(?<!\xD0)\x99/\xD0\xA9/g; # Щ<br>
return wantarray ? ( $string, $cnt ) : $string;<br>
}<br>
<font color="#888888"><br>
<br>
<br>
<br>
--<br>
С уважением,<br>
Oleg mailto:<a href="mailto:proler@gmail.com">proler@gmail.com</a><br>
</font><div><div class="Wj3C7c"><br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br>