Ramos da Informática

As codificações iso-8859-1 e UTF-8 e outras

mYSQL E MARIADB

Entenda como funcionam as codificações iso-8859-1 e UTF-8 e outras, utilizando a linguagem de programação PHP e o banco de dados MySQL.

Entenda como funcionam as codificações iso-8859-1 e UTF-8 e outras, utilizando a linguagem de programação PHP e o banco de dados MySQL.

No momento que a página começa a renderizar, ela já assume uma codificação (ou tenta detectá-la acaso não seja declarada, geralmente usa o padrão do servidor).

Os problemas comuns da codificação

É muito comum quando estamos trabalhando com acentos nos depararmos com caracteres estranhos como por exemplo:

Sobre o iso-8859-1

Eu recomendo usar iso-8859-1 se o seu site for “100% em Português” e você não necessite de “codificações extras” (como por exemplo emojis), no entanto mesmo sendo em Português você deve pensar em talvez migrar pro utf-8, um dos motivos é que em junho de 2004, o grupo de desenvolvimento da ISO/IEC responsável por sua manutenção declarou o fim do suporte a esta codificação, concentrando-se no UCS e no Unicode.

A seguir irei explicar como usar cada um deles, conforme os tópicos:





Queremos criar melhores conteúdos:

Criamos uma pesquisa sobre o seu perfil profissional:
  1. Principais objetivos;
  2. Principais Problemas no seu dia a dia;
  3. Principais Alegrias.
Participe: Pesquisa Ramos da Informática – Queremos te conhecer melhor.

Leituras que recomendamos:

– Entenda UNION e UNION ALL no SQL

E-Books gratuitos para se atualizar:

O que é necessário para usa UTF-8

Nota: A vantagem do UTF-8 é que você pode utilizar vários “idiomas” na sua página com caracteres que não são suportados pelo “iso-8859-1”.

Fonte: https://pt.wikipedia.org/wiki/ISO_8859-1

Se decidir usar UTF-8 no seu site/projeto, recomendo seguir os seguintes passos:

Scripts PHP com UTF-8 sem “BOM”

Nota: leia sobre isto em https://en.wikipedia.org/wiki/UTF-8#Byte_order_mark (Inglês)

Você deve salvar todos scripts PHP (até os que você usará com includerequire, etc) em utf-8 sem “BOM”, você pode utilizar softwares como SublimeText ou notepad++ para converter os arquivos:

Nota: que arquivos com extensão .js ou .css que usam acentos no conteúdo também ser salvos com a mesma codificação que as páginas, da mesma maneira que foi usado para salvar os documentos descritos acima, eventualmente arquivos .svg podem ser embarcados então se eles tiverem qualquer acentuação ou caractere diferente também devem ser salvos com a mesma codificação da página

MySQL com UTF-8

Para criar uma tabela em UTFf-8 no MySQL você deve utilizar algo como:

CREATE TABLE minhatabela ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, titulo varchar(300) DEFAULT NULL ) ENGINE=InnoDB CHARACTER SET=uft8 COLLATER uft8_unicode_cli;

Se as tabelas existem, então primeiro faça um BACKUP delas e depois, utilize um dos seguintes comandos (conforme a necessidade):

Converte banco de dados: ALTER DATABASE bancodedados CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Além de criar as tabelas em UTF-8 é necessário definir a conexão como UTF-8.

Com PDO é necessário usar exec:

$conn = new PDO('mysql:host=HOST;dbname=BANCO;charset=utf-8', 'USUARIO', 'SENHA');
$conn->exec('SET CHARACTER SET utf8');//Define o charset como UTF-8

 

Com o mysqli é necessário usar mysqli_set_charset:

$mysqli = new mysqli('HOST', 'usuario', 'senha', 'banco');

if ($mysqli->connect_error) {
    printf('Erro de conexão: %s', $mysqli->connect_errno);
    exit;
}

/*
 * compatibilidade para to 5.2.9 e 5.3.0.
 */
if (mysqli_connect_error()) {
    printf('Erro de conexão: %s', mysqli_connect_error());
    exit;
}

if (false === $mysqli->set_charset('utf8')) {
    printf('Error ao usar utf8: %s', $mysqli->error);
    exit;
}

 

Com mysqli procedural:

// codigo
<?php
$link = mysqli_connect('HOST', 'usuario', 'senha', 'banco');

if (mysqli_connect_error()) {
    printf('Erro de conexão: %s', mysqli_connect_error());
    exit;
}

if (!mysqli_set_charset($link, 'utf8')) {
    printf('Error ao usar utf8: %s', mysqli_error($link));
    exit;
}

 

Definindo o charset da página

Você pode usar a tag  para definir o charset, mas o recomendável é você fazer isto na resposta da requisição (resposta do servidor), definindo os “headers” (isto não quer dizer que você não deva utilizar <meta>).

Para isto, no PHP use a função header:

O motivo para se utilizar na resposta do servidor também é por causa do tempo de renderização da página quanto a resposta do servidor e páginas AJAX precisam também do charset definido por header();.

Nota: header(); sempre deve ir no topo do script antes de qualquer echoprint, ou outro tipo de exibição de conteúdo.

Em arquivos que a resposta deve ser HTML:

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

echo 'Conteudo';

 


O que é necessário para usar iso-8859-1/latin1/ansi

Para se usar iso-8859-1, você deve utilizar:

Primeiro deve salvar “todos scripts .php” como iso-8859-1 (ou ANSI) e documentos .html (se houver):

MySQL com Latin1

Quase todos servidores mysql vem configurado para usar por padrão o charset latin1, no entanto isto pode ser modificado no my.ini, então os passos a seguir sobre mysql são opcionais, pois dependerão do seu my.ini estar usando algo diferente do latin1 nas seguintes linhas:

[client]
default-character-set=<charset padrão para o cliente>

[mysql]
default-character-set=<charset padrão para o cliente>

 

Então vai precisa definir latin1, com PDO é necessário usar exec:

//codigo
$conn = new PDO('mysql:host=HOST;dbname=BANCO;charset=utf-8', 'USUARIO', 'SENHA');
$conn->exec('SET CHARACTER SET latin1');//Define o charset como UTF-8

E com o mysqli é necessário usar mysqli_set_charset: $mysqli = new mysqli('HOST', 'usuario', 'senha', 'banco'); if ($mysqli->connect_error) { printf('Erro de conexão: %s', $mysqli->connect_errno); exit; } /* * compatibilidade para to 5.2.9 e 5.3.0. */ if (mysqli_connect_error()) { printf('Erro de conexão: %s', mysqli_connect_error()); exit; } if (false === $mysqli->set_charset('latin1')) { printf('Error ao usar latin1: %s', $mysqli->error); exit; } Com mysqli procedural:
<?php
$link = mysqli_connect('HOST', 'usuario', 'senha', 'banco');

if (mysqli_connect_error()) {
    printf('Erro de conexão: %s', mysqli_connect_error());
    exit;
}

if (!mysqli_set_charset($link, 'latin1')) {
    printf('Error ao usar latin1: %s', mysqli_error($link));
    exit;
}

 

Definindo o charset da página

Basta adcionar para ; charset=iso=8859-1 após o tipo, por exemplo text/html ou application/xml ou text/plain:


<?php
header('Content-Type: text/html; charset=iso-8859-1');

echo 'Conteudo';

 

Outros tutoriais e dicas sobre PHP:

Banco de dados

Artigos e dicas sobre banco de dados que você vai gostar:

MongoDB

– Principais diferenças entre MongoDB e MySQL ou outro RDBMS

– Southbank Software apresenta dbKoda: uma ferramenta de desenvolvimento Open Source para MongoDB

MySQL e Instruções SQL em geral

– SQL e Regex – Entenda quando e como usar em instruções SQL

– MySQL – Manter o formato Date e DateTime em formato dd/mm/Year e dd/mm/Year:HH:mm:ss

– SQL – O que são VIEWS SQL, vantagens e desvantagens

– Instrução Insert MySQL e JSON com todos os bancos brasileiros

– PHP e MySQL – Entendendo as codificações iso-8859-1 e UTF-8 e outras

– Como redefinir a senha de root do MySQL ou do MariaDB

– Para que serve uma MySQL Transaction?

– Banco de Dados – Índices desnecessários no banco são um problema?

– Entenda a diferença entre LIKE, IN e BETWEEN no MySQL

– LinkedIn desenvolve a ferramenta MySQL Query Analyzer

– Como otimizar consultas MySQL

– Quando é interessante desnormalizar o banco de dados?

– Entenda Views em SQL, vantagens e desvantagens

– O que é normalização de banco de dados

– Por que não devemos usar funções do tipo mysql_*

SQL – Entenda as diferenças entre aspas simples e duplas

– SQL – Not IN ou Not EXISTS quando usar?

– SQL – Entendendo JOINS

– PHP Do Zero Ao Profissional – Análise do Curso

Subscribe to our mailing list

* indicates required


Além de PHP e MySQL, deseja receber outro tema?

Email Format


Sair da versão mobile