Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bill Barsch

[Resolvido] Problema com charset e urlencode passados na url por

Recommended Posts

Olá a todos,

Anos e anos programando e lendo fóruns e jamais tive que criar um tópico (até hoje) para tentar resolver um problema.

Mas desta vez não tenho a mínima idéia de como resolver, olhem meu problema:

 

Eu passo uma variável para a URL que deve ser recebida por uma pagina PHP.

Para passar a variavel, depois de muita procura, descobri que a melhor forma de passar strings sem dar problema com o mod_rewrite do apache é aplicar o urlencode duas vezes exemplo:

 

<a href="pagina.php&scene=<?php echo urlencode(urlencode("teste")); ?>">link</a>

Tudo até ai está ok. Os valores são recebidos normalmente pela pagina PHP usando:

 

echo $_REQUEST["scene"]; //Resultado: teste

Caso eu utilize caracteres especiais os exemplos continuam corretamente olhem só os resultados de uma teste que fiz sem passar nada pelo GET (url), apenas um script de teste local:

 

$valor = 'teste$#';

echo $valor;                              // Retorna: teste$# 
echo urlencode($valor);                   // Retorna: teste%24%23
echo $url = urlencode(urlencode($valor)); // Retorna: teste%2524%2523
echo urldecode($url);                     // Retorna: teste%24%23
echo urldecode(urldecode($url));          // Retorna: teste$#

Como podemos ver o string é codificado e decodificado sem erros dentro de um script PHP.

 

Agora o problema:

 

Caso eu utilize acentos como neste exemplo:

 

$valor = 'téste';
echo $url = urlencode(urlencode($valor));  // Retorna: t%25C3%25A9ste
echo urldecode(urldecode($url));           // Retorna: téste

Tudo ok dentro de um script de teste!

Mas, caso eu passe esta variavel para uma URL:

 

<a href="pagina.php&scene=t%25C3%25A9ste">link</a>

Ao receber o valor numa pagina PHP ela vem com erros, vejam:

 

echo mb_detect_encoding($_REQUEST["scene"]); // Retorna: UTF-8 (só para verificar se é UTF-8 mesmo)
echo $_REQUEST["scene"];                     // Retorna: t?ste 

Será que deu pra entender?

Depois que passo o valor codificado por uma URL através de um GET e recebo este valor, o valor vem com um erro de CHARSET

com um ponto de "?" (interrogação) onde deveria vir uma letra acentuada "é".

É como se o navegador estivesse decodificando o valor "t%25C3%25A9ste" de forma errada, sendo que quero que venha acentos e ele só me traz pontos de interrogação.

Não posso usar esta variável para fazer uma busca no banco de dados pois o MYSQL entende que "t?ste" é diferente de "téste"

 

Um detalhe importante:

Quando eu passo o valor

<a href="pagina.php&scene=t%25C3%25A9ste">link</a>
O retorno já vem decodificado pelo browser:

echo $_REQUEST["scene"];                     // Retorna: t?ste 
Eu nunca utilizei a função de decodificação porque não era necessário:

echo urldecode(urldecode($_REQUEST["scene"]));

Não tenho a mínima idéia do porque desta letra acentuada vir assim sem tradução.

 

Todos os browsers dão o mesmo erro.

Qualquer ajuda de quem entende de charset no PHP será extremamente bem vinda.

 

Coisas que já tentei:

 

<?php

header('Content-Type: text/html; charset=utf-8');
ini_set('default_charset','UTF-8');

?>
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
</head>
(Colocados no início da página que recebe o GET)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não basta apenas verificar se a codificação da transmissão e das páginas está UTF-8.

Você precisa saber se o ARQUIVO é do tipo UTF-8. Dependendo do seu editor, você pode alterar isso facilmente.

 

Mas você não poderia enviar esses dados de outra forma? Sessions, input hiddens...

Outra coisa que você podia fazer é criar um algoritmo simples que faça conversão das letras, e depois destrocasse na hora de ler. Um tipo de criptografia.

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou alterando todos os arquivos de site para UTF-8, vamos ver se dá certo...

 

obs:

Eu notei que existem inconsistências realmente... quando uso a função strtolower() do php ela estraga a string convertendo caracteres acentuados para um formato que é visualizado como "?"

para estes casos sei que existe a opção do mb_strtolower();

Não entendo muito de utf-8 mas acabei fazendo a migração total para este formato

Banco de Dados, PHP e HTML (agora né)

 

Não deu certo...

 

o fato do valor codificado estar vindo do GET decodificado e, ainda por cima, com caracteres estranhos não é algo que tem tudo a ver com algum problema básico que talvez alguem saiba como resolver?? http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, depois de quebrar a cabeça por horas... (umas 24 horas seguidas!!! :lol: )

Eu resolvi o problema de uma forma totalmente anti profissional

Olhem só:

 

Os valores do GET estão vindo decodificados automaticamente pelo PHP. Pois como fala na documentação, as variaveis superglobais ($_GET,$_POST) são decodificadas automaticamente. Acontece que a forma de decodificação dos valores está vindo com um charset que eu não consigo compreender. Caracteres com acento estão vindo como "?" e não há nada que resolva isso, nenhum tipo de conversão funcionou para mim (iconv, uft8_decode, etc, etc)

Desta forma para que eu possa recuperar os dados do GET sem erros achei uma variavel do $_SERVER[]

que traz os valores do GET em uma string:

 

echo $_SERVER["QUERY_STRING"]; //Retorna: user=bill&scene=t%25C3%25A9ste

Então usei a função parse_str(); para transformar esta string em ARRAY;

E fica assim:

 

parse_str($_SERVER["QUERY_STRING"],$get_array);
print_r($get_array);
/*
Retorna:
Array {
   ["user"] = 'bill',
   ["scene"] = 'téste'
}
*/

Perfeito! De alguma forma o PHP não decodifica automaticamente esta QUERY STRING. Pra falar a verdade ele decodifica pois como podemos ver eu não usei o urldecode() em momento algum para chegar até o valor "téste"

mas não é que funcionou?? :D

Não sei se estive diante de um bug. Acho que minha experiência ainda não foi o suficiente para chegar e este ponto. Mas tá ai a solução. Obrigado Matheus por responder. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.