Ir para conteúdo

Arquivado

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

silas_i

[Resolvido] Acentuação UTF-8 e ISO

Recommended Posts

Me desculpem resgatar este tópico, mas é que minha dúvida se relaciona a isso, e eu não ía criar um novo tópico para falar sobre isso, não é?

 

Bom, é o seguinte, estou querendo trabalhar com codificação UTF-8 e, como não poderia ser diferente a qualquer mudança, estou tendo problemas.

 

Bom, vamos por partes.

 

1) O Banco de Dados (MySQL):

Tenho uma tabela de categorias, a qual está utilizando a codificação Collation: utf8_general_ci, e as colunas dessa tabela também estão usando a mesma Collation.

 

2) O arquivo PHP:

O meu arquivo PHP que recbe os resultados do Banco está assim:

<?php

	header("Content-Type: application/xhtml+xml; charset=utf-8", true);

	echo "<?xml version='1.0' encoding='UTF-8'?>\n";

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-br">
<head>
	<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
[continua]
Até aqui, não está tudo como deveria?

 

Eu verifiquei os dados no Banco, estão todos corretos. Para ter certeza que os dados estariam corretos, eu criei uma nova tabela e inseri os dados novamente. Mas... Quando tenho palavras acentuadas, ele está retornando aquele losango com um sinal de interrogação dentro (no caso do Firefox) no lugar do caractere.

 

Mas é assim, tirando o Banco, ele apresenta erros da mesma forma. Estou trabalhando com includes, e adicionei inclusive este trecho em cada arquivo de include:

header("Content-Type: application/xhtml+xml; charset=utf-8", true);
Mas não adianta, os caracteres acentuados são exibidos com aquele losango.

 

E o engraçado é que, se eu pego o conteúdo do include e coloco diretamente na página que o chama, aí não apresenta erros! Mas os dados do Banco continuam com erros (tudo bem, resolvendo este do include, depois verifico o do Banco).

 

Pergunto-lhes: o que deve ser feito para que os includes sejam exibidos corretamente com uso do charset UTF-8?

 

Como falei, depois verifico o banco...

 

Obrigado desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifique se o editor de textos está usando encode UTF-8

 

pode ser que você esteja usando um editor de textos com encoding LATIN_ISO ou algum outro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa pessoal. Estive acompanhando este tópico e sei que ele está "resolvido".

Mas, com o perdão da palavra, não resolveram não.

 

O padrão UTF-8 é o mais indicado para os sites de hoje em dia. O problema é que muita gente encontra problemas

ao resolver isso no HTML + PHP + MySQL.

O UTF-8 suporta acentos SIM.

O UTF-8 suporta outras letras de outros idiomas.

 

Isso significa que o ISO-8859-1 está meio desatualizado. A W3C recomenda UTF-8.

 

Porém, se vocês adicionarem essas tags:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br">
	<head>
		<title></title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        ...

Não é nescessário adicionar o comando:

<?php header('Content-Type: text/html; charset=utf-8') ?>
Isso é muito errado, pois o Validador da W3C acusa erro de dois headers, e avisa que considerará apenas um.

 

Uma forma de ajustar isso e ver onde está errado é:

  • Configurar seu editor de texto para salvar em UTF-8.
  • Dar um ECHO no PHP com acentos para ver se está correto.
  • Escrever acentos no HTML para ver se está correto.
  • Ajustar a base de dados para utf8 e utf8_unicode_ci juntamente com as tabelas.

Só que isso todos fazem, e nunca da certo. Isso porque o canal que o PHP abre com o MySQL, tanto para

consulta, exibição e conexão, por padrão é latin1.

Para resolver este problema, basta apenas adicionar os seguintes comandos após a conexão ser aberta:

mysql_query("SET NAMES 'utf8'");
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');

Com isso, o PHP para de tentar converter para latin1 o UTF-8, e o browser passa a exibir corretamente os acentos dentro

dos padrões hoje utilizados.

 

Só isso. Espero que sirva para quem veio até aqui, e também para quem venha a ter essa dúvida.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

L2mago

 

isso que você comentou está certo mas não condiz com o tópico

 

no tópico nao diz que UTF-8 não é o correto.

 

a escolha do encoding depende da decisão de cada desenvolvedor.

 

pessoalmente sempre aconselho uso do UTF-8.

 

 

consulte: PHP, HTML, MySQL - Charset Encoding

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Moderador, estava apenas dando uma resposta ao que o Rails disse:

 

porque o utf8 dá erros?

porque ele não contém acentos xD

 

o padrão que você tem que usar é o iso..

 

olha só..

 

pra html:

 

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />

 

pro php:

 

<?php header("Content-Type: text/html; charset=ISO-8859-1",true);?>

Cada um escolhe sim, o charset que quiser. Como também podemos escolher usar XHTML/CSS ou HTML antigo.

Achei meio desnecessária sua resposta. Mas faça um retorno do banco neste teu link do jeito que criou,

e terá o mesmo erro citado aqui.

 

De nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1. veja data do tópico

2. analise as circuntâncias

3. analise o que escreveu e veja se há coerência com o contexto do tópico.

4. falow

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, isso é ridículo.

 

Eu vi que o tópico estava fechado, e era um pouco antigo. Apenas deixe uma informação, como também disse no meu post,

para quem viesse futuramente.

 

Circunstâncias?

 

Há coerência no que eu escrevi, pois a solução do tópico foi voltar para ISO-8859-1 o que o cara queria fazer em UTF-8.

A solução está ai para quem não quiser ver seus dados retornando distorcidos, e ainda pretendem manter formato UTF-8.

Agora, você quer retrucar tudo o que eu escrevo, e ainda cisma que não era essa a solução.

 

Isso não é moderação, é tripúdio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa pessoal. Estive acompanhando este tópico e sei que ele está "resolvido".

Mas, com o perdão da palavra, não resolveram não.

 

O padrão UTF-8 é o mais indicado para os sites de hoje em dia. O problema é que muita gente encontra problemas

ao resolver isso no HTML + PHP + MySQL.

O UTF-8 suporta acentos SIM.

O UTF-8 suporta outras letras de outros idiomas.

 

Isso significa que o ISO-8859-1 está meio desatualizado. A W3C recomenda UTF-8.

 

Porém, se vocês adicionarem essas tags:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br">
	<head>
		<title></title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        ...

Não é nescessário adicionar o comando:

<?php header('Content-Type: text/html; charset=utf-8') ?>
Isso é muito errado, pois o Validador da W3C acusa erro de dois headers, e avisa que considerará apenas um.

 

Uma forma de ajustar isso e ver onde está errado é:

  • Configurar seu editor de texto para salvar em UTF-8.
  • Dar um ECHO no PHP com acentos para ver se está correto.
  • Escrever acentos no HTML para ver se está correto.
  • Ajustar a base de dados para utf8 e utf8_unicode_ci juntamente com as tabelas.

Só que isso todos fazem, e nunca da certo. Isso porque o canal que o PHP abre com o MySQL, tanto para

consulta, exibição e conexão, por padrão é latin1.

Para resolver este problema, basta apenas adicionar os seguintes comandos após a conexão ser aberta:

mysql_query("SET NAMES 'utf8'");
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');

Com isso, o PHP para de tentar converter para latin1 o UTF-8, e o browser passa a exibir corretamente os acentos dentro

dos padrões hoje utilizados.

 

Só isso. Espero que sirva para quem veio até aqui, e também para quem venha a ter essa dúvida.

 

Abraços.

 

 

Pessoal, sei que este item já foi setado como RESOLVIDO. Mas gostaria de fazer algumas considerações:

Nosso amigo Lmago postou com muita propriedade duas coisas, uma a solução para se resolver um problema que é uma constante na vida de muitos desenvolvedores, no qual me incluo e a outra é que a grande maioria das postagens sobretudo em nível de desenvolvimento não se tornam obsoletas. Eu mesmo me tornei membro deste Fórum, e o acho uma referência justamente por sempre encontrar as soluções ou caminhos ou um 'pesquise mais a respeito, porém me dando uma linha de direcionamento sobre onde pesquisar ou o que pesquisar', a partir de postagens que ocorreram a anos atrás.

 

Sendo assim aproveito a oportunidade para agradecer ao Lmago e a todos os que postam suas dúvidas pois delas vêm as soluções, aos que postam soluções e/ou caminhos para tal e sobretudo a Equipe Imasters que aumentando a cada dia o poder de abstração, permite que sejamos a potência que somos no que tange a Produzir Internet no Brasil.

 

Agora talvez burlando alguma regras do Fórum, e nós desenvolvedores/designers fomos feitos sobretudo para burlar as regras de modo a criarmos novas regras, tenho uma dúvida apartir da colocação do Lmago que se alguém puder esclarecer ficarei grato.

 

Minha grande dor de cabeça com charset começou com o surgimento do Ajax. Visto que ele (desculpe-me se estiver enganado) trabalha específicamente com UTF8, e aí preciso fazer os encondes/decodes para ter renorno em ISO-8859-1. Neste caso, aplicando a sua sugestão, os caracteres brasileiros seriam carregados normalmente, ou seja acentos, caracteres especiais, etc.? Ou teria que continuar com os decodes nesse caso?

 

Agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

 

Achei duas páginas super interessantes para resolver problemas de conversão de Charset.

 

Para pequenos reparos ou reparos rápidos (com direito a conversão on-line)

http://www.unicodetools.com/unicode/utf8-to-latin-converter.php

 

Classe em PHP para repararar seu banco de dados inteiro:

http://www.phpwact.org/php/i18n/utf-8/mysql

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa pessoal. Estive acompanhando este tópico e sei que ele está "resolvido".

Mas, com o perdão da palavra, não resolveram não.

 

O padrão UTF-8 é o mais indicado para os sites de hoje em dia. O problema é que muita gente encontra problemas

ao resolver isso no HTML + PHP + MySQL.

O UTF-8 suporta acentos SIM.

O UTF-8 suporta outras letras de outros idiomas.

 

Isso significa que o ISO-8859-1 está meio desatualizado. A W3C recomenda UTF-8.

 

Porém, se vocês adicionarem essas tags:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br">
	<head>
		<title></title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        ...

Não é nescessário adicionar o comando:

<?php header('Content-Type: text/html; charset=utf-8') ?>
Isso é muito errado, pois o Validador da W3C acusa erro de dois headers, e avisa que considerará apenas um.

 

Uma forma de ajustar isso e ver onde está errado é:

  • Configurar seu editor de texto para salvar em UTF-8.
  • Dar um ECHO no PHP com acentos para ver se está correto.
  • Escrever acentos no HTML para ver se está correto.
  • Ajustar a base de dados para utf8 e utf8_unicode_ci juntamente com as tabelas.

Só que isso todos fazem, e nunca da certo. Isso porque o canal que o PHP abre com o MySQL, tanto para

consulta, exibição e conexão, por padrão é latin1.

Para resolver este problema, basta apenas adicionar os seguintes comandos após a conexão ser aberta:

mysql_query("SET NAMES 'utf8'");
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');

Com isso, o PHP para de tentar converter para latin1 o UTF-8, e o browser passa a exibir corretamente os acentos dentro

dos padrões hoje utilizados.

 

Só isso. Espero que sirva para quem veio até aqui, e também para quem venha a ter essa dúvida.

 

Abraços.

 

 

 

sei que isso já está resolvido, e o tópico fechado a algum tempo, mesmo assim gostaria de deixar minha consideração...

 

 

MUITO OBRIGADO MESMO... VOCÊ RESOLVEU MEU PROBLEMA DE MTO TEMPO...

APESAR DE PARECER SIMPLES MEXER COM CHARSET, EU QUERO VER O "PROFISSIONAL" ou amador que nunca tenha passado por problemas com ele...

 

e isso resolveu 100% pra mim... parabéns e obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa pessoal. Estive acompanhando este tópico e sei que ele está "resolvido".

Mas, com o perdão da palavra, não resolveram não.

 

O padrão UTF-8 é o mais indicado para os sites de hoje em dia. O problema é que muita gente encontra problemas

ao resolver isso no HTML + PHP + MySQL.

O UTF-8 suporta acentos SIM.

O UTF-8 suporta outras letras de outros idiomas.

 

Isso significa que o ISO-8859-1 está meio desatualizado. A W3C recomenda UTF-8.

 

Porém, se vocês adicionarem essas tags:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br">
<head>
	<title></title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       ...

 

Não é nescessário adicionar o comando:

<?php header('Content-Type: text/html; charset=utf-8') ?>

Isso é muito errado, pois o Validador da W3C acusa erro de dois headers, e avisa que considerará apenas um.

 

Uma forma de ajustar isso e ver onde está errado é:

  • Configurar seu editor de texto para salvar em UTF-8.
  • Dar um ECHO no PHP com acentos para ver se está correto.
  • Escrever acentos no HTML para ver se está correto.
  • Ajustar a base de dados para utf8 e utf8_unicode_ci juntamente com as tabelas.

 

Só que isso todos fazem, e nunca da certo. Isso porque o canal que o PHP abre com o MySQL, tanto para

consulta, exibição e conexão, por padrão é latin1.

Para resolver este problema, basta apenas adicionar os seguintes comandos após a conexão ser aberta:

mysql_query("SET NAMES 'utf8'");
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');

 

Com isso, o PHP para de tentar converter para latin1 o UTF-8, e o browser passa a exibir corretamente os acentos dentro

dos padrões hoje utilizados.

 

Só isso. Espero que sirva para quem veio até aqui, e também para quem venha a ter essa dúvida.

 

Abraços.

 

Salvou a pátria meu amigo. Desde que iniciei a programação PHP eu ninguém, mas ninguém, nem professor consegui explicar o lance do collaction e charset. Com simples argumento já entendi tudo e funcionou. Devido a este problema, sem fiz meus sistemas com latin1 mas já sabia que o melhor seria utf8 até porque a w3c recomenda.

 

Com isso, ufaaaaaaaa! Nem acredito. Todos os novos sistemas será modelado em utf8 até que em fim!!!

 

Nota 10 pro brodi ai!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é necessário usar o SET NAMES ou SET Character para cada conexão com o banco se o mesmo estiver corretamente configurado.

O mesmo se dá para os casos onde usuários apontam o uso de utf8_encode() como solução definitiva.

 

1. Isso serve apenas para os casos onde se torna inviável consertar o charset de um sistema inteiro, ou seja, é uma gambiarra.

2. consome processos do servidor. É pouca coisa mas, somatize os diversos processos pequenos e irrelevantes e terá um problema dos grandes.

3. Padronização do código, internacionalização.

Compartilhar este post


Link para o post
Compartilhar em outros sites

silas_i tá no php você tá puxando arquivo de banco de dados?

 

se for o banco pode estar em utf8 e as tabelas em latin_1 ou utf8

 

porque o utf8 dá erros?

porque ele não contém acentos xD

 

o padrão que você tem que usar é o iso..

 

olha só..

 

pra html:

 

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />

 

pro php:

 

<?php header("Content-Type: text/html; charset=ISO-8859-1",true);?>

 

os dois tem que ficar em iso pra nenhum ficar invertendo entendeu? ^^

caso seja menu em flash que eu acho que não é! você teria que arrumar ele na opção de idiomas.. não lembro a localização exata no menu, não tenho flash aqui nesta máquina..

 

abraço ^^

 

Valeu cara resolveu o meu problema!! :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mesmo com o tópico resolvido, quero postar a solução que eu encontrei talvez seja o caso de alguém que passe por aqui. :D

Mesmo adicionando dentro da tag head a linha abaixo:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

O problema dos acentos persistia.

Então percebi no canto inferior direito do "notepad++" que a codificação estava em "ANSI", então eu fui em [Formatar] > [Converter para UTF-8 Sem BOM] e o problema foi resolvido.

Eu utilizo o "Sem BOM" pois já tive outros problemas onde aparecia uma linha dividindo a página em alguns locais onde tinham DIVS ou Quebras de página, "não me lembro ao certo" sei que esta solução resolveu o problema e de lá pra cá sempre uso ela.

Boa sorte. :ph34r:

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.