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">'<'</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">"impossivel abrir $file: $!"</span><span class="pun">;</span><span class="pln"><br>
binmode TXT</span><span class="pun">,</span><span class="pln"> </span><span class="str">':bytes'</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"><</span><span class="pln">TXT</span><span class="pun">>;</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">'utf-8'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">'iso-8859-1'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'utf-8'</span><span class="pun">);</span><span class="pln"><br>
$buf </span><span class="pun">=</span><span class="pln"> $iconv</span><span class="pun">-></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 "cru", 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 "ã" vira "Ã", 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>