Ir para conteúdo

Arquivado

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

hinom

PHP, HTML, MySQL - Charset Encoding

Recommended Posts

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

Imagem Postada

 

 

Clique em "Conversões" -> "Codificação do Texto"

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif

Imagem Postada

 

 

Escolha "Unicode, UTF-8"

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif

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

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

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

 

 

<?phprequire('include.php');?><html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><title>Page Title - Título da página</title><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body>OK á é í ú ó</body></html>
Execute o arquivo "include-iso.php" e veja o resultado:

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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.