Pessoal,

depois de uma longa estrada acabei de me deparando com o seguinte problema. O Cliente queria que os títulos das categorias, de um site que estava desenvolvendo, aparecessem todos em maiúsculas. Pensei: Simples. Utilizo o strtupper e está tudo resolvido. Para meu desespero ele realmente converteu as letras para maiúsculas mas, as que tinha acentos, ficaram todas zoneadas.

Ai começou a batalha. Pesquisei, pesquisei, achei algumas rotinas feitas por outros, testei e não funcionou. Tentei a dica de mudar a variável LC_ALL para pt_BR do server com o comando setlocale ( setlocale(’LC_ALL’,'pt_BR’); ), o mesmo para a variável LC_TYPE, mas isso funcionou parcialmente. De início tudo ficou certinho até o dia que o Terra (local onde o site do meu cliente estava hospedado) resolveu mudar de servidor. Pronto. Nem isso funcionava.

Depois de pensar, digitar, testar, não funcionar e começar tudo de novo, acabei criando uma pequena função que acho que vai funcionar em 100% dos casos. Ao menos testei de todas as formas e funcionou.

O que a função abaixo faz é pegar a string e aplicar sobre ela o comando htmlentities. Este comando irá converter acentos e tudo mais para uma “linguagem” html apropriada (HTML ENTITIES), ou seja, o > se tornará > etc etc etc.

Depois ela converte esta nova string toda para maiúscula com a função strtoupper. Deste modo as letras serão todas convertidas só que as HTML ENTITIES (representação usada pelo html para caracteres especiais), que representam as letras acentuadas, também ficarão em maiúscula, o que causa um problema: & Ccedil; (que representa Ç) não é a mesma coisa que Ç . Então, o que é feito em seguida é transformar os ENTITIES para o padrão, através de uma substituição com o comando preg_replace.

Pronto. É isso. A função está abaixo e espero que sirva para alguém.

Abraços,

Diego

function maiusculas($nomex) {
        $nomex = htmlentities($nomex);
        $nomex = strtoupper($nomex);

        $from[0]="/Ç/";
        $from[1]="/Ã/";
        $from[2]="/Á/";
        $from[3]="/Ã/";
        $from[4]="/Â/";
        $from[5]="/À/";
        $from[6]="/É/";
        $from[7]="/Ê/";
        $from[8]="/È/";
        $from[9]="/Í/";
        $from[10]="/Ĩ/";
        $from[11]="/Î/";
        $from[12]="/Ì/";
        $from[13]="/Ó/";
        $from[14]="/Õ/";
        $from[15]="/Ô/";
        $from[16]="/Ò/";
        $from[17]="/Ú/";
        $from[18]="/Ũ/";
        $from[19]="/Û/";
        $from[20]="/Ù/";

       // ATENÇÃO ! O Espaço em branco entre o & e o restante da string
       // não deve existir. Ele foi colocado apenas pq o Wordpress converte
       // as ENTITIES para sua representação correta, automaticamente.
        $to[0]="& Ccedil;";
        $to[1]="& Atilde;";
        $to[2]="& Aacute;";
        $to[3]="& Atilde;";
        $to[4]="& Acirc;";
        $to[5]="& Agrave;";
        $to[6]="& Eacute;";
        $to[7]="& Ecirc;";
        $to[8]="& Egrave;";
        $to[9]="& Iacute;";
        $to[10]="& Itilde;";
        $to[11]="& Icirc;";
        $to[12]="& Igrave;";
        $to[13]="& Oacute;";
        $to[14]="& Otilde;";
        $to[15]="& Ocirc;";
        $to[16]="&O grave;";
        $to[17]="&U acute;";
        $to[18]="&U tilde;";
        $to[19]="&U circ;";
        $to[20]="&U grave;";

        $nomex = preg_replace($from,$to,$nomex);

        return $nomex;

    }