Article mis à jour le : 05-05-2022
Explication sur l'encodage UTF-8, et comment bien l'utiliser pour vos sites InternetL'encodage iso-8859-1 vous limite à 256 caractères au maximum, car il n'est encodé que sur un 1 octet. Etant donné qu'un octet fait 8 bits, qu'il y a deux états possibles, le 0 et le 1, cela nous fais 2^8 = 256 caractères différents au maximum.
La méthode la plus simple consiste à placer cette ligne dans votre .htaccess à la racine de votre site :
php_flag default_charset utf-8€€‹
Pour bien paramétrer votre base de données, il faut penser lorsque vous créer des champs, texte par exemple (TEXT), il faut préciser l'encodage en UTF8. Sous PHPmyAdmin par exemple, il s'agit du champ "interclassement", et choisir "utf8_general_ci".
Vous pouvez aussi la créer via une requête SQL :
CREATE TABLE votre_table (
ID int(11) NOT NULL auto_increment,
NOM varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
ALTER
TABLE
`votre_table`
CONVERT
TO
CHARACTER
SET
utf8
Il s'agit de vérifier que vos fichiers, donc ce de votre site, soit bien encodés en utf8. Pour cela, il faut voir avec votre éditeur. NetBeans le fait pas défaut, mais pour Notepad ++, ce n'est pas le cas. Sur ce dernier, il faut aller dans "Paramétrage", "Préférences", sélectionner l'onglet "Nouveau document" -> "Répertoire" puis cocher "UTF-8 sans BOM". Notez que vous pouvez aussi convertir des fichiers existants dans notepad++ : pour cela il vous suffit de cliquer sur "Encodage" -> "Convertir en UTF8 sans BOM" puis enregistrer.
Il s'agit de spécifier l'encodage des données qui sont véhiculées par la requête. Pour cela on le spécifie avant cette dernière (ici sous mysql) :
<?php
mysql_connect ('localhost', 'root', '');
mysql_set_charset ('UTF8');
?>
Si vous utilisez PDO, ce n'est guère plus compliqué :
<?php $madb = new PDO ('mysql:host=localhost;dbname=MaDB', 'root', '', array (PDO::MYSQL_ATTR_INIT_COMMAND => 'SET DONNEES 'UTF8'')); ?>
Si vous travaillez sous apache, sachez que ce dernier n'utilise pas UTF8 par défaut. Il faut donc le préciser pour ses requêtes, via le fichier .htaccess encore :
AddDefaultCharset UTF-8
Pour cela il existe deux méthodes: Soit dans le header (donc avant d'afficher du code) :
header('Content-Type: text/html; charset=utf-8');
Soit via cette balise meta entre les balises <header> et </header> de votre site :
€€‹<meta http-equiv="Content-type" content="text/html; charset=utf-8" />€€‹
La première méthode prendra toujours le dessus si jamais les deux sont présentes. Cependant, sachez que la première présente l'avantage d'éviter les surprises si jamais vos fichiers HTML ne précisent pas d'encodage en entête.
Vous pouvez aussi forcer l'encodage dans les formulaires :
<form accept-charset="utf-8">
...
Enfin, vous pouvez garder sous la main cette petite fonction PHP qui pourait vous être utile en milieu hostile :
string utf8_encode ( string $data )
Exemple :
$maChaine = utf8_encode ( $maChaine ); // encore le contenu de la variable en UTF8
Vous pouvez aussi utiliser cette fonction qui retire tous les caracères UTF-8 non supportés dans les fichiers XML :
function utf8_for_xml($string)
{
return preg_replace('/[^x{0009}x{000a}x{000d}x{0020}-x{D7FF}x{E000}-x{FFFD}]+/u',
' ', $string);
}
Voilà, normalement, vous êtes parés pour faire un site plein d'accents !