
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;
}

10 Responses
Felipe Diesel
Setembro 17th, 2007 at 1:39 pm
1Você poderia usar CSS para fazer isso:
text-transform: uppercase;
Claro que dependendo do local não é adequado, porém há esta possibilidade.
Luciano Closs
Novembro 18th, 2007 at 8:06 pm
2Para contornar o problema do Wordpress, use as mesmas html entities:
& = &
diego
Novembro 20th, 2007 at 12:15 pm
3Valeu Felipe.
Valeu Luciano.
Caio Ariede
Fevereiro 6th, 2008 at 1:20 pm
4Opa, eu sei que esse post é um pouco antigo, mas queria deixar aqui uma idéia.. hehe depois vou postar no meu blog também pois esta fora do ar. :S
com uma ajudinha das expressões regulares, segue..
Caio Ariede
Fevereiro 6th, 2008 at 1:20 pm
5deu pau no post de cima..
?php
$texto = ‘ÁÉÍóÚ’;
$texto = preg_replace(’/&([A-Z])(?i)(acute|cedil|circ|grave|tilde);/e’, ‘\’&\’.strtolower($1).\’$2;\”, htmlentities($texto));
echo $texto;
?
Diego Albuquerque
Fevereiro 6th, 2008 at 3:25 pm
6Caio, valeu pela dica cara. Muito bom.
Cara.. olha que eu tentei usar expressão regular, mas não sei porque simplesmente quando chegava no Ç , ele não reconhecia. Algo muito estranho.
Abraços,
Diego
Junior ...
Março 12th, 2008 at 3:03 am
7Diogo parabens pelo script
acabei de me deparar com o mesmo problema seu, e foi resolvido
obrigado
saúde e paz para ti
Villas
Abril 5th, 2008 at 12:01 pm
8Opa obrigado …me ajudou aqui e no meu caso foi transformar tudo em não acentuação do tipo: çãó para CAO (maiúsculas e sem acentos) mas preciso pensar ainda nos caracteres não alfa-numéricos tipo !(@#!(*{}
Abraço
Marcelo Araujo
Abril 22nd, 2008 at 7:11 pm
9Obrigado… fiz um site para minha igreja e estava com o maior problemão com os acentos convertidos em maiusculas… valeu
Abraços e dias de Paz
Daniel Costa
Agosto 14th, 2008 at 2:42 pm
10No PHP, a função mb_strtoupper() resolve isso rapidin também, inclusive com os caracteres acentuados!
RSS feed for comments on this post · TrackBack URI
Leave a reply
Significado: Guardar algo para futura consulta. Muito utilizado na informática para arquivar acessos a informações ou serviços para futuras auditorias. Logo, quando dá alguma m*#$%& , o administrador do site vira pro lado, pensa Fu#$*@ e vai logo consultar os últimos logs para ver o que foi que houve.
O ÚltimoLOG surgiu desta idéia de guardar tudo. Os últimos lampejos de criatividade, as últimas idéias, as mais recentes descobertas, ou seja, tudo que for legal para uma futura consulta e o mais importante, tudo em prol de compartilhar o conhecimento. Espero que gostem. ;D
Assine e Acompanhe!
Assine e receba todas as atualizaçõesou Receba por email:
Categorias
Arquivos
Links
Meta
Calendário
Artigos Recentes
Últimos Comentários
Mais comentados
ÚltimoLOG is proudly powered by WordPress - BloggingPro theme by: Design Disease