Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Exemplo prático sobre como preparar o PHP, o HTML e o Banco de dados MySQL para um determinado conjunto de caracteres.
O charset utilizado neste tutorial é o conjunto multibyte UTF-8.
Para este exercício, utilizaremos o editor de textos, EditPad Lite (versão brasileira)
Tela inicial do EditPad Lite
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
/applications/core/interface/imageproxy/imageproxy.php?img=http://img214.imageshack.us/img214/8672/001w.png&key=0f332836861f8e4b5b6fa4c8010684fc154280df818fdbc73192c0feaab57206" alt="Imagem Postada" />
Clique em "Conversões" -> "Codificação do Texto"
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
/applications/core/interface/imageproxy/imageproxy.php?img=http://img214.imageshack.us/img214/7518/002q.png&key=0531d5c1f2a8f4fa30a7e947ef25101f43b079d86a3d48a059ace770ed9b8628" alt="Imagem Postada" />
Escolha "Unicode, UTF-8"
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
/applications/core/interface/imageproxy/imageproxy.php?img=http://img214.imageshack.us/img214/4748/003y.png&key=9b2bdf4ae0fc8bd234d7671ce708307bbf32c0c52ff1c3e26eed12c39f121587" alt="Imagem Postada" />
OK, agora, cole o seguinte código e salve como "index.html"
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
/applications/core/interface/imageproxy/imageproxy.php?img=http://img214.imageshack.us/img214/4368/004j.png&key=eb66a557b8208e04cd96e1b70ea9159f1760bef10293cd0b04991b862310ed7b" alt="Imagem Postada" />
<html>
<title>PHP, HTML, MySQL - Charset Encoding</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
</head>
<body>
<form action="char_test.php" method="POST">
<textarea name="text" cols="25" rows="10">
English
Português
日本語
中文
عربي
Ελληνικά
עִברִי
Čeština
हिन्दी
</textarea>
<input type="submit">
</form>
</body>
</html>
Abra uma nova aba no editor para criarmos um novo arquivo
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
/applications/core/interface/imageproxy/imageproxy.php?img=http://img214.imageshack.us/img214/1417/006.png&key=5ae2cb94ef4f3283bcdc3f1df11e8125acf2b6adbff763c8144f476eec693d50" alt="Imagem Postada" />
Salve-o como "charset_test.php"
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
http://img214.imageshack.us/img214/3240/007n.png
Cole o seguinte código:
<?php
$v = 'text';
$$v = false;
if( isset( $_POST[$v] ) )
{
$$v = $_POST[$v];
}
if( $$v )
{
$conn = mysql_connect( 'localhost', 'root', '' );
mysql_select_db( 'charset_test', $conn );
$sql = "INSERT INTO encoding ( `text` ) VALUES ( '" . $$v . "' );";
mysql_query( $sql, $conn );
mysql_close( );
}
?>
[<a href="./">inserir</a>] [<a href="list.php">exibir</a>]
Abra uma nova aba no editor para criarmos um novo arquivo
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
http://img214.imageshack.us/img214/1417/006.png
Salve-o como "list.php"
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
http://img2.imageshack.us/img2/3249/013.png
Cole o seguinte código:
<html>
<title>PHP, HTML, MySQL - Charset Encoding</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head></head>
<body>
[<a href="./">inserir</a>]
<hr>
<?php
$conn = mysql_connect( 'localhost', 'root', '' );
mysql_select_db( 'charset_test', $conn );
$sql = "SELECT `text` FROM encoding ORDER BY `text` ASC;";
$data = mysql_query( $sql, $conn );
while( $l = mysql_fetch_array( $data, MYSQL_ASSOC ) )
{
echo PHP_EOL . '<hr>' . nl2br( $l['text'] );
}
mysql_close( );
?>
</body>
</html>
Base de dados para testes
para este exemplo,
nome do banco: charset_test
nome da tabela: encoding
CHARSET: utf8
COLLATE: utf8_general_ci ( A sigla "ci" significa "Case Insensitive" )
CREATE DATABASE charset_test;
USE charset_test;
CREATE TABLE `encoding` (
`id` int(4) NOT NULL auto_increment,
`text` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Acesse o local da página index.html
( exemplo: http://localhost/charset/ )
O conteúdo abaixo deverá aparecer na tela
http://forum.imasters.com.br/public/style_emoticons/default/seta.gif
http://img2.imageshack.us/img2/4862/011t.png
[pressione o botão indicado pela seta vermelha]
Após o envio, a seguinte tela será exibida:
http://img214.imageshack.us/img214/6126/012k.png
* Clique em [inserir] para incluir mais dados
* Clique em [exibir] para listar os dados cadastrados
Obs: A partir do PHP 5.3.0, utilize o cabeçalho
header('Content-Type: text/html; charset=utf-8');em todas as páginas onde deseja que o conteúdo seja enviado como o respectivo encoding ao browser.Mesmo especificando a "Meta Tag HTML", o browser Firefox não reconhece, causando problemas na apresentação do conteúdo.
Mais uma sugestão, aceita pelo Hinom para usuários de Sistemas Operacionais Unix like:
Caso esteja conectando-se ao MySQL via terminal (Com o famoso comando mysql -u nomedousario -p), tenha certeza que esta conexão também está com o character-set correto.
Como assim?
Acontece que muitas vezes (isso aconteceu comigo) a sua conexão do PHP com o MySQL pode estar perfeita, tudo com o mesmo encoding, character set e collation, tudo perfeito. Mas quando você confere pelo terminal vê os caracteres quebrados.
Sim, dá a impressão de que o PHP e o MySQL estão errados e o terminal está certo, mas não necessariamente.
Para fazer o teste, conecte-se ao MySQL pelo terminal com o seginte comando: mysql -u nomeusuario -p --default-character-set=charset
Onde: nomeusuario é o seu nome de usuário e charset é o charset que você está querendo configurar o servidor.
Vamos supor que seu usuário seja root você deixou PHP, HTML e MYSQL configurados para rodar em UTF-8. Sua conexão deve ficar algo assim:
mysql -u root -p --default-character-set=utf8
Ou então para o famoso: ISO-8859-1
mysql -u root -p --default-character-set=latin1
Caso a sua conexão ocorra com o seu charset desejado e os dados ficaram estragados, então significa que ali eles foram inseridos por outro charset. Ahá! Pegamos o erro!
Então se você alterar na unha (via update) os dados (Agora sua coenxão está no charset certo) vão ficar corretos no terminal.
Se tudo ocorreu certo ao atualizar sua página PHP você notará que os caracteres também ficaram certos lá.
Para definir o default-character-set no MYSQL para não precisar ficar forçando via terminal basta especificá-lo no seu arquivo de configuração do MySQL (my.cnf ou my.ini).
[mysql]
default-character-set=seucharset
Simulação de erros comuns
Simulação 1
1. Configure o editor de textos para encoding "UTF-8"
2. Crie um novo arquivo chamado "include.php", com formato UTF-8 e vazio.
3. Configure o editor de textos para encoding "iso-8859-1".
4. Crie um novo arquivo chamado "include-iso.php", com formato "iso-8859-1" contendo o seguinte script:
/applications/core/interface/imageproxy/imageproxy.php?img=http://img12.imageshack.us/img12/8276/charsetencodingphpconfl.png&key=33242440151c5b4095e3707da1bc4a3605ba1c37d24e6ad6a4162bcc7e3e47ca" alt="Imagem Postada" />
UTF-8 + MySQL FULLTEXT
http://forum.imasters.com.br/index.php?/topic/374346-utf-8-fulltext-problemao/
Problemas com codificação: acentos não interpretados
http://www.rberaldo.com.br/blog/2009/11/06/problemas-com-codificacao-acentos-nao-interpretados/
Codificação de Caracteres (W3.org)
http://www.w3.org/International/O-charset.pt-br.php
Character Sets / Character Encoding Issues
http://www.phpwact.org/php/i18n/charsets
setagens em tempo de execução, sem necessidade de converter dados conforme o ambiente em que é executado
http://forum.imasters.com.br/topic/467664-erro-acentuacao-php/page__view__findpost__p__1854202