Maneira Alternativa de Resolver Problema de Acentuação – Ajax

Sabemos (ou pelo menos deveríamos saber) que o grande Boom do segundo semestre de 2006, foi Ajax todos os blogs possíveis e imagináveis abordavam o tema, era muita empolgação, todos os sites tinham que ter Ajax, em pouco tempo perguntavamos como poderíamos existir sem o tal Ajax😉, até que no final do ano com o intensivo uso de Ajax, vimos que não é as mil maravilhas. Percebemos que Ajax não é perfeito, como todas as coisas, e começaram a ter movimentos com grandes críticas ao Ajax, eu simpatizo com ele, mas como tudo na vida, na medida certa. Enfim, não estou aqui pra julgar o pobre coitado e se você quer ler mais sobre isso, na internet tem um monte de blogs que abordam o tema e no meu blogroll, que ainda vou fazer, também tem alguns que abordam. Como sempre, ou na maioria das vezes, vim apenas trazer o código.
Só fiz essa introdução, pois não tinha falado sobre isso e como todo bom anfitrião tenho que fazer as honras.

Cenário:
Nesse novo emprego, estamos implementando uma parte do site que utiliza ajax, para pesquisa em banco e como era de se imaginar esbarrei no problema de acentuação, e eu logo foi ao senhor-que-tudo-sabe (leia-se: Google), afim de uma resposta e a que mais achei foi de mudar o header da página server-side (no meu caso, php) e client-side (javascript e o HTML), para ISO-8859-1 (creio que a numeração seja essa) e vi um post muito bom lá no Elmicox (se você não conhece esse blog, não sabe o que está perdendo, ele saca muito só não passei o permalink, pois eu não salvei-o) logo fui testar, e para minha surpresa não deu certo, continuei a minha busca e nada encontrei, até que nós mesmos resolvemos a questão de uma maneira muito simples e de uma forma alternativa que achei muito legal e como disse simplérrima (isso ficou meio gay), a solucão baseia-se em substituir os caracteres acentuados, por aqueles códigos de acentuação do html e depois retornar essa troca para o javascript e os valores o html interpretar automaticamente a acentuação, vamos ao que interessa:
.
no PHP:

function html_scape($strIn) {
$arr_procura = array (‘á’, ‘à’, ‘ã’, ‘â’, ‘ä’, ‘õ’, ‘ò’,’ó’, ‘è’, ‘é’, ‘ê’, ‘ë’, ‘ì’, ‘í’, ‘ï’, ‘ç’, ‘Á’, ‘À’, ‘Ã’, ‘Â’, ‘Ä’, ‘Õ’,’Ò’, ‘Ó’, ‘È’, ‘É’, ‘Ê’, ‘Ë’, ‘Ì’, ‘Í’, ‘Ï’, ‘Ç’);
$arr_troca = array (‘á’,’à’, ‘ã’, ‘â’, ‘ä’, ‘õ’, ‘ ò’, ‘ô’, ‘è’, ‘é’, ‘ ê’, ‘ë’, ‘ì’, ‘í’, ‘ï’,’ç’, ‘Á’,’À’, ‘Ã’, ‘Â’, ‘Ä’, ‘Õ’, ‘Ò’, ‘Ô’, ‘È’, ‘É’, ‘Ê’, ‘Ë’, ‘Ì’, ‘Í’, ‘Ï’,’Ç’);
return str_replace($arr_procura, $arr_troca, $strIn);
}

Pega-se por parâmetro a string que contém os caracteres que irão ser trocados. (Utilizei o retorno do sql, para o javascript).
A array $arr_procura, recebe os caracteres que vão ser procurados ( no nosso caso os acentuados).
A array $arr_troca, recebe os caracteres que vão ser trocados (no nosso caso aquele código html).
Após manda-se retornar a troca dos caracteres através da função str_replace.

Obs: Poderíamos utilizar um array bidimensional para fazer a troca, pois um array complementa o outro, mas para fins de melhor entendimento fiz duas arrays.
Como disse anteriormente, os arrays se complementam,logo você tem que manter a ordem do posicionamento dos caracteres que vão ser trocados.

Obs2: No meu caso os caracteres especias, são apenas, os acentuados, então o meu array ficou dessa forma, mas você pode alterar esse array da forma que for necessário pra ti, respeitando , é claro, o posicionamento nos dois arrays.

Comentem, please…

fuiii…

19 respostas para Maneira Alternativa de Resolver Problema de Acentuação – Ajax

  1. micox disse:

    Opa. Beleza.
    Valeu pelos elogios.

    Minha solução realmente tá meio capenga pois expliquei pouco. Dei a entender que o negócio era simples e talz hehe.
    Na verdade TUDO deve estar com o mesmo charset, ou seja, se mudar só o charset via PHP não vai funfar (eu não expliquei isto lá mas descobri com o tempo através de dúvidas que o pessoal me mandava).

    Apesar de você ter dito que sua solução é meio gambiarra, ela é a solução CORRETA.
    Desde o início do HTML que existem os chamados HTML entities (pesquise sobre isto no google) e ELES são a forma correta de se referenciar caracteres especiais no HTML (no xml não, no xml tem que colocar o charset correto mesmo).

    Sobre esta função que você colocou aí, pode apagar ela. O PHP tem uma função nativa prontinha e completa: HTMLENTITIES – http://br.php.net/html_entities

  2. ramon disse:

    Valeu pela dica,
    mas agora sim é a solução definitiva, eu já tinha ouvido falar sobre essa função, mas nunca tinha feito nada. Eu disse que era gambiarra, não o que eu estava FAZENDO e sim COMO estava fazendo, pois sabia que deveria ter uma função nativa do php para fazer isso, imagine com mais caracteres especiais? seria horrível montar o array, sem contar que você pode errar o código html correspondente, mas com essa função, não há esse problema.

    Muito obrigado pelo comentário,
    Tu sabe pacas e ainda teve a paciência de comentar no meu humilde blog, mto legal.

  3. mica disse:

    isto esta uma merda!!!

  4. ramon disse:

    Olá mica,
    poderia ser um pouco mais específico em “isto está uma merda”, você está se referindo ao blog? ou ao post? E outra coisa, esse tipo de comentário seu é totalmente desnecessário e não ajuda em nada, se você não gostou de algo, você tem que falar e o porque também, pois só assim eu posso trocar a “merda”, mas enfim não é possível pedir muito de pessoas como você, que nem criticar faz de uma forma legal.
    Atenciosamente,
    Ramon
    ps: obrigado pela visita, volte outras vezes, mas eu troquei de endereço. OK
    ps2: Da próxima vez, por favor dê um endereço de e-mail válido, Ok?

  5. Wagner disse:

    Blz, funfa tranquilo, serve bem ao propósito.
    Obrigado pela dica ramon!!!

  6. ramon disse:

    disponha e lembre-se que não estou mais nesse blog. estou lá em
    http://www.coisasdeweb.blogspot.com

    fuiiii…

  7. Suisso disse:

    Minha solução é mais facil ehhehe

    como envio os dados via ajhax utilizo escape() nos mesmos ae no PHP eu soh pego com rawurldecode
    mema coisa porem sem necessidade de criar funções avulsas ;D

  8. ramon disse:

    Pois é Suisso,
    o Micox tinha falado sobre isso no comentário dele.

    Foi por isso que eu coloquei o título do post “maneira alternativa”, pois quando tive que resolver o problema, eu procurei a função e não tinha encontrado, então resolvi do meu próprio jeito.😄.

    Valeu ai pela dica. e Volte Sempre. agora eu estou lah no http://coisasdeweb.blogspot.com

    fuiii…

  9. Regis disse:

    O xmlhttprequest usa UTF-8. Para uso dos caracteres acentuador, que são ISO-8859-1, basta mandar esse cabeçalho para o seu documento html.

    No php: header(“Content-Type: text/html; charset=ISO-8859-1”,true)

    Isso dispensa o uso de qualquer outra função, sacaram?

  10. ramon disse:

    Perfeitamente,
    Regis porém nem sempre é possível fazer isso, pois por exemplo eu trabalho da seguinte maneira.
    um arquivo que vai faer a conexão (js)
    um arquivo que o Ajax chama pra fazer a busca (php)
    um arquivo com os sqls das chamadas do arquivo da busca (o arquivo da busca faz a chamada para esse arquivo)

    E é nesse caso que a sua solução não serve, pois quando o arquivo da busca recebe a resposta do arquivo do sql, ele perde o charset, ou seja, não adianta setar, pois não vai conseguir acentuar, mas se vc usa apenas um arquivo para a busca, a sua solução funciona, infelizmente no meu caso não.

    Volte Sempre!

  11. Regis disse:

    ramon, acho que você tá doidão. Primeiro porque você faz uma conexão com o banco de dados usando javascript (???). Eu só tinha visto isso com ADO e uma mistura esquisita de ASP e Javascript. Mas você está usando php também? Bom, deixa pra lá, isso é outro assunto… vai ver que você conhece uma técnica jedi secreta, sei lá…

    Mas voltando ao problema dos caracteres especiais, você deve setar o cabeçalho – header(“Content-type… – no arquivo no qual você chama o outro, através de ajax, e não no arquivo chamado. Por exemplo, se vc tem um arquivo index.php e determinado evento – onclick, onload, qq um – dispara a chamada a carregar um arquivo, por exemplo, combo.php, o header deve estar no index.php e não no combo.php, sacou?

    Se o arquivo que faz a chamada por ajax for .html, vc pode colocar no cabeçalho do html a meta tag , aí tanto faz a codificação padrão do servidor, ou se no seu banco de dados foram gravados caracteres especiais, codificados ou não.

    Tenta isso e deixa essas tosqueiras de lado… não precisa usar urldecode, nem a função html_scape, simplifica sua vida!

  12. ramon disse:

    Primeiro -> onde eu coloquei que o arquivo js faz a conexão eu me referi à conexão ajax, que o melhor termo seria requisição, não estava falando da conexão ao bd.

    Segundo -> Não continuarei discutindo esse assunto contigo, pois estava tratando-lhe com respeito e você tá me chamando de doidão sem motivos. Nunca vi um artigo seu na internet, não te conheço de lugar algum e não tenho porque achar que vc tenha algo à me oferecer, se tratando de conhecimento, você nem entendeu qual é a situação em que o uso disso é necessário e antes de discutir você nem simulou a situação em casa e vem chamar a função urldecode de tosqueira, se fosse tosqueria essa função não seria nativa do php, vc poderia chamar a função html_escape que foi a que eu fiz, de tosqueira, pois quando fiz esse post não conhecia a função urldecode e ainda quer me ensinar a dar um charset no header, com todo respeito, vc está de sacanagem com a minha cara.

    Mas esse pensamento é válido para pessoas que pegam projetos pequenos, em que você faz estrutura da forma que quiser. Em projetos grandes, você já tem todas as classes, toda a estrutura definidas e vc não pode simplesmente mudar a estrutura (nesse caso, colocar um header na classe), pois isso pode alterar o comportamento de outras funções (métodos) e pelo que eu vi no seu curriculo vc deveria saber disso, pois vc sabe POO.

    Enfim, muito obrigado pelo comentário, volte sempre e da próxima vez que for comentar no blog de outra pessoa, ou no meu, seja um pouco mais educado, ou se não for pelo menos tente ser conhecido, porque só assim a sua opinião vai ser levada em consideração. Humildade meu caro.

    Abraços,
    Ramon

  13. Regis disse:

    kkkk.. minha hipótese foi confirmada, vc tá doidão mesmo! E o que é pior: sem nem um pingo de senso de humor. Tu não entendeu uma vírgula do que eu falei hein, mané? não precisa mudar estrutura nem de classes, nem de funções, nem nada.. só adicionar UMA linha de código no arquivo principal.

    Bom, quem for um pouco mais esclarecido, pode aproveitar minha dica aí e parar de ter dor de cabeça com caracteres especiais!
    😛

  14. Ramon disse:

    Vou escrever um post sobre isso, de que só a sua “solução” não funciona.

    Porém de qualquer forma, os mais esclarecidos (como vc mencionou, anteriormente), vão conseguir entender o título “Maneira Alternativa de Resolver Problema de Acentuação – Ajax”.
    Você sabe o que a palavra alternativa quer dizer?

    Pelo visto você tem um humor deprimente, não é educado e ainda não sabe interpretar um texto, mas não se preocupe que segundo um estudo, mais de 70% dos brasileiros alfabetizados, não entendem o que lêem, seria pedir demais de você entender um texto inteiro.

    Abraços,
    Ramon

  15. Alberi disse:

    Isso é um gato na cara dura!

    em outras palavras POG!!!!

    Conconrdo com Regis a solução é aquela e não tem pra onde correr!

  16. ramon disse:

    É POG sim, por isso utilizei a palavra “alternativa”. Mas enfim, é um post antigo e naquele momento tentei trocar o charset e não funcionou, na época que escrevi , não sabia que quando se fazia uma requisição ajax, o php não lê o header e por isso não trocava o charset, e sim utilizar a função utf8_decode().

    Agradeço por dar a sua opinião e disponha.

  17. Ana disse:

    Eu não chamaria de POG, pois é uma função com um objetivo e muito bem estruturada. POG é quando você começa uma função no meio tem que inventar outras coisas para se chegar numa solução.

    Se vocês não sabem, essa função muita gente usa e afinal se o PHP não tivesse as receitas de bolo pronta, vocês estariam dando um ctrl+c nesse blog😉

    E vê se aprendam um pouco com a humildade do autor que fez o favor de compartilhar um conhecimento válido.

  18. Ramon disse:

    Olá Ana,

    Muito obrigado pelo apoio, isso é verdade muita gente usa esse tipo de função, mas vamos ser sinceros, que não é a forma mais elegante de resolver, né?!rs

    No ponto de vista que existe outros métodos melhores, até concordo que têm um certo nível de POG aí, mas a função em si, não é.

    Porém é como disse no post, naquela ocasião, não encontrei outro jeito de fazê-lo e essa serviu como uma luva.

    Mais uma vez, obrigado Ana.

  19. fiabani disse:

    Tchê, vejam este post, acredito ser útil p/ quem se depara com problemas de acentuação via ajax
    OBS.: não tem ajax, mas p/ algumas aplicações funciona
    http://wilianfiabani.wordpress.com/2009/01/21/uma-solucao-alternativa-ao-ajax/
    espero ter ajudado, t+

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: