Ir para conteúdo

POWERED BY:

Arquivado

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

Jack.Psycho

Problemas de Acentuação com XML gerado por PHP

Recommended Posts

Tenho um PHP que gera um arquivo XML baseado na minha tabela, tudo funciona sem problemas, porém, os acentos não aparecem, tentei de tudo, mudar o cabeçalho do xml, usar <![CDATA[""]]>, utf8 encode e não consigo utilizar acentuação.

 

Se eu criar um arquivo no notepad, SalvarComo codificação UTF8 o sistema funciona perfeitamente, com acentos e tudo mais, porém se eu utilizar o xml criado pelo PHP os acentos somem.

 

Alguém pode me ajudar ?

 

Segue o código do PHP que gera o XML

 

<?
include("conectar.php");
  
  //SQL
  $sql = mysql_query("SELECT * FROM contatos ORDER BY id ASC");
  
  //TOTAL DE LINHAS AFETADAS PELA CONSULTA
  $row = mysql_num_rows($sql);
  
  //VERIFICA SE A PESQUISA RETORNOU ALGUMA LINHA
  if($row > 0) {
    
	//ARQUIVO
	$arquivo = "contatos.xml";
	
	//ABRE O ARQUIVO(SE NÃO EXISTIR, CRIA)
	$ponteiro = fopen($arquivo, "w");
	
	//ESCREVE NO ARQUIVO XML
	fwrite($ponteiro, "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\r\n");
	fwrite($ponteiro, "<contato>\r\n");
	
	for($i=0; $i<$row; $i++) {
	  
	  //PEGA OS DADOS DO SQL
	  $id   = mysql_result($sql,$i,"contatos.ID");
	  $nome = mysql_result($sql,$i,"contatos.NOME");
	  $telefone= mysql_result($sql,$i,"contatos.TELEFONE");

	  //MONTA AS TAGS DO XML
	  $conteudo  = "<nome=\"$nome\" telefone=\"$telefone\" /> \r\n";
	  
	  //ESCREVE NO ARQUIVO
	  fwrite($ponteiro, $conteudo);
	}//FECHA FOR
	
	//FECHA A TAG AGENDA
	fwrite($ponteiro, "</contato>");
	
	//FECHA O ARQUIVO
	fclose($ponteiro);

	
	//MENSAGEM
	echo "O arquivo <b>".$arquivo."</b> foi gerado com SUCESSO !";
  }//FECHA IF($row)
?>

Consegui resolver o problema acima mas agora apareceu outro, de duas uma, ou eu viro o cara mais paciente do mundo ou vou ficar maluco em 2 anos.

 

O problema agora é o seguinte.::

 

Se o XML for criado com aspas duplas ou aspas simples o XML retorna erro, até aí tudo bem, já esperava isso, usei então eregi_replace (usei tb preg_replace) para remover as aspas simples e duplas do meu registro.

 

$str = eregi_replace ("(\"|\')", "", $str);

Funciona que é uma beleza com aspas duplas, mas se o usuário digitar uma palavra com aspas simples (') no campo o php retorna erro.::

 

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Aspas Simples' "

 

Achei então que seria algum erro com o código, fiz um arquivo de teste para checar essa dúvida.

 

<?php
	  $teste = "Teste com 'Aspas Simples' e \"Aspas Duplas\" ";
	  $teste = eregi_replace ("(\"|\')", "", $teste); 
	  echo  $teste;
?>

E funcionou sem problemas, removeu as aspas simples e duplas da minha frase, a questão é porque cargas d´água, não funciona na hora de gerar o xml e retorna esse erro ?

 

Quanto mais mexo com PHP me sinto mais burro.

 

Alguém sabe como resolver isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, de acordo com sua descrição, o erro está na query, justamente porque as aspas simples não estão escapadas. Agora, essa query é executada antes ou depois de tentar criar o XML? Pergunto isso porque você sempre precisa escapar as aspas simples, e para isso existem duas possibilidades: de maneira automática ou manualmente.

 

A primeira maneira, automática, ocorre quando a diretiva magic_quotes_gpc está ativa nas configurações do PHP. Se ela não estiver ativa, é necessário que as aspas simples sejam escapadas com a função addslashes().

 

Para me facilitar, faço assim:

function escapeSpecialChars($string){	return (!get_magic_quotes_gpc()) ? addslashes($string) : $string;}
Mas lembre-se de escapar apenas para executar a query, pois pode acontecer de uma aspa simples já estar escapada e você escapar novamente, aí ficaria com duas aspas simples seguidas e tals... Para evitar isso, também utilizo um procedimento similar ao demonstrado acima, só que inversamente:
function removeSlashes($string){	return (get_magic_quotes_gpc()) ? stripslashes($string) : $string;}
Com essa função, se a diretiva magic_quotes_gpc estiver ativa, então isso significa que o valor que veio do formulário já estará escapado, então preciso remover esses escapes...

 

Bom, não sei se era essa sua dúvida e também se isso pode te ajudar, mas enfim, fica aí minha colaboração...

 

 

Outra coisa, mesmo que você tenha resolvido a questão da codificação, mas todos os seus arquivos estão com o mesmo charset, por exemplo, UTF-8? Se algum dos arquivos envolvidos não estiver com esse charset, com certeza encontrará caracteres estranhos...

 

 

:joia:

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.