0

Locale - trabalhando com acentos

criado por Roberto Bertó em 04/12/2000 12:00pm
Um conselho que eu sempro faco eh que as pessoas leiam o manual. Alguns chegam a dizer que 90% das duvidas podem ser resolvidas nele. Os outros 10% so vem com a pratica.

Ha alguns dias escrevi uma funcao que teve uma certa repercusao. Ela se encontra dentro da minha pagina de classes do repositorio de classes do Manuel Lemos (http://phpclasses.upperdesign.com/browse.html/author/8382) e se chama Strings. Nela a maioria das funcoes sao relacionadas a conversao de \"caracteres especiais\" (áéí) que possuem acento para caracteres maiusculos, etc.

Porem na classe tambem consta de diversas funcoes para o tratamento de string como a php_quote que tira apenas as tags de abertura do PHP, ou entao a normal que transforma \"caracteres especiais\" em \"caracteres normais\", sem acentuação ou ainda a file_ext e file_noext que retorna a extensao de um arquivo ou o seu prefixo, entre outras funcoes.

Para minha supresa varias de suas funcoes sao inuteis em termos praticos. Sao elas: lowercase, strtolower, uppercase, strtoupper, ucfirst, lcfirst, ucwords, lcwords. Estas funcoes nao passam de adaptacoes das orignais para trabalhar com acentuacao.

Recebi um email hoje do Leonardo Dias (madleo@camburi.tacnet.com.br) me explicando que eu nao precisava usar as funcoes pois havia um meio do PHP reconhecer a acentuacao. Trata-se da funcao setlocale, tambem dentro da secao strings no manual.

A dica eh a seguinte:

<h><?PHP
setlocale(LC_CTYPE,\"pt_BR\");
print strtoupper(\"áéíó\");
?></h>

Basta voce chamar a funcao setlocale com o parametro pt_BR antes de usar as funcoes de conversao de strings que elas irao funcionar. Sugiro que voce de uma boa olhada na descricao da funcao dentro do manual do PHP.

Outra forma que dispensa a invocacao da funcao, segundo o Dias, eh configurar a biblioteca locale do sistema operacional. Eu ainda nao tinha entrado em contato com essa biblioteca mas suponho que para configura-la voce deva mexer com as ENV do sistema. Prometo que ainda irei escrever um artigo sobre isso, é só eu ter tempo para analisar.

Mas fica ai a minha critica a respeito do manual do PHP. Claro que ele nao tem a obrigacao de abordar com todos os detalhes, inclusive porque a biblioteca locale nao deve ter sido feita pela equipe do PHP, certo? Mas faltou algo na descricao da funcao setlocale. Faltou exatamente a lista de \"locales\", ou linguas, disponiveis na biblioteca. Inclusive quem falou do pt_BT foi o Dias. Eu cheguei a ler essa funcao mas eu nao dei bola a ela pois eu nao deduzi \"qual era\" a do locale. E talvez, mesmo se eu ja soubesse o que a funcao fazia eu iria demorar algum tempo para adivinhar qual era a chave para nossa lingua. Eu iria pensar em pt, br, mas pt_BR iria demorar algum tempo, se eh que eu iria adivinhar.

Mais uma dica: tome cuidado com o LC_ALL pois no futuro o PHP ira implentar mais algumas funcionalidades ao locale e ai pode dar problemas no seus scripts.

Vale lembrar que a classe que eu criei tem varias funcoes uteis e interessantes e as funcoes que tornaram-se obsoletas para quem leu essas dicas ainda assim sao boas para serem analisadas. Eu usei de expressoes regulares nas funcoes o que as torna bem rapidas e curtas. Mais uma promessa (cobrem-me delas): vou explicar o que eu sei de expressoes regulares.

Mais informacoes:
http://www.php.net/manual/function.setlocale.php

Comentários:

Mostrando 1 - 2 de 2 comentários
Muito obrigado. Cheguei a postar uma nova FAQ e vasculhando achei. Obrigado...
20/12/2004 1:49pm (~19 anos atrás)

Cléver Anjos disse:
É Roberto,
Realmente nem sempre temos tempo (ou paciencia) de procurar algo nos manuais e vamos reinventando a roda...
26/01/2004 8:18am (~20 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)