<p>только вот производительность подобных решений оставляет желать сильно лучшего. я даже использовал модуль типа Lingvo::RU::Detect, реализованный подобным образом. после отключения скорость работы выросла в 4 раза, и я думаю что подобные вещи не слишком приемлемы.<br>
</p><p></p><div class="gmail_quote">27 ноября 2008 г. 9:09 пользователь Oleg Alexeenkov <span dir="ltr">&lt;<a href="mailto:proler@gmail.com">proler@gmail.com</a>&gt;</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>
&gt; 2008/11/27 Oleg Alexeenkov &lt;<a href="mailto:proler@gmail.com">proler@gmail.com</a>&gt;:<br>
&gt;&gt; Здравствуйте, Vladimir.<br>
&gt;&gt;<br>
&gt;&gt; Вы писали 27 ноября 2008 г., 2:11:00:<br>
&gt;&gt;<br>
&gt;&gt;&gt; 2008/11/27 Ruslan Zakirov &lt;<a href="mailto:ruz@bestpractical.com">ruz@bestpractical.com</a>&gt;:<br>
&gt;&gt;&gt;&gt; Может проще остаться с csv и предварительно его iconv&#39;ертить в UTF-8<br>
&gt;&gt;<br>
&gt;&gt;&gt; Лучше все-таки Encode&#39;вертить :)<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Ктонить делал бенчмарки енкоде-иконвы-ручного(tr///)?<br>
<br>
&gt; Во первых бенчмарк делать бессмысленно, т.к. ни tr ни iconv не дадут<br>
&gt; строк с флагом<br>
&gt; Во вторых tr - только для 1байтных кодировок, а ucs2 и utf8 относятся<br>
&gt; к многобайтовым.<br>
</div>Можно чуть усложнить и..<br>
<div class="Ih2E3d">&gt; Хоте конечно можно рассмотреть iconv+utf8::upgrade vs decode<br>
</div>Не всегда нужен флаг.<br>
А если очень захотеть...<br>
<br>
[да, я знаю что так делать нехорошо ;)]<br>
<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp;$config{&#39;trans&#39;}{&#39;cp1251&#39;} ||=<br>
&quot;\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&quot;;<br>

 &nbsp; &nbsp; &nbsp;$config{&#39;trans&#39;}{&#39;koi8-r&#39;} ||=<br>
&quot;\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&quot;;<br>

 &nbsp; &nbsp; &nbsp;$config{&#39;trans&#39;}{&#39;iso8859-5&#39;} ||=<br>
&quot;\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&quot;;<br>

 &nbsp; &nbsp; &nbsp;$config{&#39;trans&#39;}{&#39;cp866&#39;} ||=<br>
&quot;\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&quot;;<br>

<br>
<br>
sub cp_trans_count { &nbsp; &nbsp;#v1<br>
 &nbsp;my ( $cfrom, $cto, $string ) = @_;<br>
 &nbsp;return $string if $cto eq $cfrom or !length($string) or !$cfrom or !$cto;<br>
 &nbsp;return utf_trans( $cto, $string ) if $cfrom eq &#39;utf-8&#39; and $config{&#39;trans&#39;}{$cto};<br>
 &nbsp;return to_utf_trans( $cfrom, $string ) if $cto eq &#39;utf-8&#39; and $config{&#39;trans&#39;}{$cfrom};<br>
 &nbsp;my $cnt;<br>
 &nbsp;if ( $config{&#39;trans&#39;}{$cfrom} and $config{&#39;trans&#39;}{$cto} ) {<br>
 &nbsp; &nbsp;( $cfrom, $cto ) = \( $config{&#39;trans&#39;}{$cfrom}, $config{&#39;trans&#39;}{$cto} );<br>
 &nbsp; &nbsp;eval &quot;\$cnt = \$string =~ tr/$$cfrom/$$cto/&quot;;<br>
 &nbsp;}<br>
 &nbsp;return wantarray ? ( $string, $cnt ) : $string;<br>
}<br>
<br>
<br>
sub utf_trans {<br>
 &nbsp;my ( $cto, $string ) = @_;<br>
 &nbsp;return if $cto eq &#39;utf-8&#39;;<br>
 &nbsp;my ( $cnt, $cnt2 );<br>
 &nbsp;$cnt += $string =~ s/\xD0\x81/\xF0/g; &nbsp; &nbsp; # e<br>
 &nbsp;$cnt += $string =~ s/\xD1\x91/\xF1/g; &nbsp; &nbsp; # E<br>
 &nbsp;$cnt += $string =~ s/\xD0\x84/\xF4/g; &nbsp; &nbsp; # ukr beg<br>
 &nbsp;$cnt += $string =~ s/\xD1\x94/\xF5/g;<br>
 &nbsp;$cnt += $string =~ s/\xD0\x86/\xF6/g;<br>
 &nbsp;$cnt += $string =~ s/\xD1\x96/\xF7/g;<br>
 &nbsp;$cnt += $string =~ s/\xD0\x87/\xF8/g;<br>
 &nbsp;$cnt += $string =~ s/\xD1\x97/\xF9/g; &nbsp; &nbsp; # ukr end<br>
 &nbsp;$cnt += $string =~ s/\xE2\x80\x94/-/g; &nbsp; &nbsp;# -<br>
 &nbsp;$cnt += $string =~ s/\xC2\xAB/&quot;/g; &nbsp; &nbsp; &nbsp; &nbsp;# &lt;<br>
 &nbsp;$cnt += $string =~ s/\xC2\xBB/&quot;/g; &nbsp; &nbsp; &nbsp; &nbsp;# &gt;<br>
 &nbsp;$cnt += $string =~ s/\xD1\x98/j/g; &nbsp; &nbsp; &nbsp; &nbsp;#<br>
 &nbsp;$cnt += $string =~ s/\xD0\xB9/\xA9/g; &nbsp; &nbsp; # й<br>
 &nbsp;$cnt += $string =~ s/\xD0([\x90-\xBF])/chr(ord($1)-16)/eg;<br>
 &nbsp;$cnt += $string =~ s/\xD1([\x80-\x8F])/chr(ord($1)+96)/eg;<br>
 &nbsp;( $string, $cnt2 ) = cp_trans_count( &#39;cp866&#39;, $cto, $string );<br>
 &nbsp;$cnt += $cnt2;<br>
 &nbsp;$cnt += $string =~ s/\x21\x16/\xB9/g;<br>
 &nbsp;return wantarray ? ( $string, $cnt ) : $string;<br>
}<br>
<br>
sub to_utf_trans {<br>
 &nbsp;my ( $cfrom, $string ) = @_;<br>
 &nbsp;return if $cfrom eq &#39;utf-8&#39;;<br>
 &nbsp;my $cnt;<br>
 &nbsp;# &nbsp;$cnt += $string =~ s/\xE9/\xD0\xB9/g; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # й<br>
 &nbsp;$cnt += $string =~ s/\xAB/&quot;/g; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# &lt;<br>
 &nbsp;$cnt += $string =~ s/\xBB/&quot;/g; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# &lt;<br>
 &nbsp;( $string, $cnt ) = cp_trans_count( $cfrom, &#39;cp866&#39;, $string );<br>
 &nbsp;$cnt += $string =~ s/([\x80-\x88\x8A-\xA8\xAA-\xAF])/&quot;\xD0&quot;.chr(ord($1)+16)/eg;<br>
 &nbsp;$cnt += $string =~ s/([\xE0-\xE8\xEA-\xEF])/&quot;\xD1&quot;.chr(ord($1)-96)/eg;<br>
 &nbsp;$cnt += $string =~ s/\xF0/\xD0\x81/g; &nbsp; &nbsp; # e<br>
 &nbsp;$cnt += $string =~ s/\xF1/\xD1\x91/g; &nbsp; &nbsp; # E<br>
 &nbsp;$cnt += $string =~ s/\xF4/\xD0\x84/g; &nbsp; &nbsp; # ukr beg<br>
 &nbsp;$cnt += $string =~ s/\xF5/\xD1\x94/g;<br>
 &nbsp;$cnt += $string =~ s/\xF6/\xD0\x86/g;<br>
 &nbsp;$cnt += $string =~ s/\xF7/\xD1\x96/g;<br>
 &nbsp;$cnt += $string =~ s/\xF8/\xD0\x87/g;<br>
 &nbsp;$cnt += $string =~ s/\xF9/\xD1\x97/g; &nbsp; &nbsp; # ukr end<br>
 &nbsp;$cnt += $string =~ s/(?&lt;!\xD0)\xB9/\x21\x16/g; &nbsp; &nbsp;# №<br>
 &nbsp;$cnt += $string =~ s/(?&lt;!\xD0)\xA9/\xD0\xB9/g; &nbsp; &nbsp;# й<br>
 &nbsp;$cnt += $string =~ s/(?&lt;!\xD0)\x89/\xD0\x99/g; &nbsp; &nbsp;# Й<br>
 &nbsp;$cnt += $string =~ s/(?&lt;!\xD0)\xE9/\xD1\x89/g; &nbsp; &nbsp;# щ<br>
 &nbsp;$cnt += $string =~ s/(?&lt;!\xD0)\x99/\xD0\xA9/g; &nbsp; &nbsp;# Щ<br>
 &nbsp;return wantarray ? ( $string, $cnt ) : $string;<br>
}<br>
<font color="#888888"><br>
<br>
<br>
<br>
--<br>
С уважением,<br>
&nbsp;Oleg &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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>