Tenho certeza de que o assunto foi levantado várias vezes na lista, então, ATENÇÃO: o Perl tem excelentes mecanismos para tratar I/O em diversas codificações da maneira mais prática possível. Por exemplo, dá para pegar arquivo em ISO-8859-1 do STDIN e jogar para STDOUT em UTF-8, isso é canja de galinha. Sempre que abre um handle, é só especificar o que tem dentro que...<br>

Aí que está o MEU problema: nunca sei de antemão o que tem dentro :P<br>A solução mais viável que encontrei até agora foi:<br><pre id="thepaste" class="prettyprint"><span class="pln">        </span><span class="kwd">my</span><span class="pln"> $buf</span><span class="pun">;</span><span class="pln"><br>

        </span><span class="kwd">eval</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br>                open</span><span class="pun">(</span><span class="pln">TXT</span><span class="pun">,</span><span class="pln"> </span><span class="str">&#39;&lt;&#39;</span><span class="pun">,</span><span class="pln"> $file</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">or</span><span class="pln"> </span><span class="kwd">die</span><span class="pln"> </span><span class="str">&quot;impossivel abrir $file: $!&quot;</span><span class="pun">;</span><span class="pln"><br>

                binmode TXT</span><span class="pun">,</span><span class="pln"> </span><span class="str">&#39;:bytes&#39;</span><span class="pun">;</span><span class="pln"><br>                </span><span class="kwd">local</span><span class="pln"> $</span><span class="pun">/</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">undef</span><span class="pun">;</span><span class="pln"><br>

                $buf </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">TXT</span><span class="pun">&gt;;</span><span class="pln"><br>                close TXT</span><span class="pun">;</span><span class="pln"><br>

        </span><span class="pun">};</span><span class="pln"><br><br>        </span><span class="kwd">my</span><span class="pln"> $iconv </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Text</span><span class="pun">::</span><span class="typ">Iconv</span><span class="pun">(</span><span class="pln">detect_utf8</span><span class="pun">(</span><span class="pln">$buf</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">&#39;utf-8&#39;</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">&#39;iso-8859-1&#39;</span><span class="pun">,</span><span class="pln"> </span><span class="str">&#39;utf-8&#39;</span><span class="pun">);</span><span class="pln"><br>

        $buf </span><span class="pun">=</span><span class="pln"> $iconv</span><span class="pun">-&gt;</span><span class="pln">convert</span><span class="pun">(</span><span class="pln">$buf</span><span class="pun">);</span><span class="pln"><br>

        </span><span class="typ">Encode</span><span class="pun">::</span><span class="pln">_utf8_on</span><span class="pun">(</span><span class="pln">$buf</span><span class="pun">);</span><span class="pln"><br></span></pre>

Explicando: abro o arquivo do jeito &quot;cru&quot;, sem nenhuma codificação. Carrego o conteúdo no buffer. Aí uso Text::Iconv para converter a codificação. Detalhe importantíssimo: mesmo que os dados já estejam em UTF-8, ainda assim precisa aplicar o Text::Iconv. E ainda não acabou: Perl não reconhece o buffer como algo que tenha codificação UTF-8 até que eu force o flag UTF-8. Pronto! Depois disso tudo, $buf é um autêntico UTF-8. Posso dar uc() que &quot;ã&quot; vira &quot;Ã&quot;, e /\w/ pega os acentos também.<br>

Aqui está o código completo: <a href="http://tinypaste.com/c3680">http://tinypaste.com/c3680</a><br>A pergunta é: existe alguma maneira menos ineficiente de se fazer isto?<br clear="all"><br>ABS()<br><br>