Glorious paint avec moi qui hurle sur des caractères mal affichés

Gestion de l’encodage, des caractères accentués

Introduction

Afin de pouvoir gérer correctement le stockage, la récupération et l’affichage de caractères accentués ou autres kanjis, il est important d’avoir un bon encodage sur l’ensemble des supports de notre site ; sous peine de se retrouver avec des caractères mal gérés ��� ^^’

Pour cela, il y a 3 points clés :

Base de données

Doit être géré à deux endroits :

  • Lors de la création de la base de données, il faut bien spécifier l’ Interclassement en tant que  utf16_general_ci dans la liste déroulante (vous pouvez sélectionner la liste et taper “utf” pour y naviguer plus rapidement).
    • Edit 2023 : 🚨 Attention, même si la base est définie avec le bon encodage, parfois certaines tables, voir certains champs n’ont pas le même
  • Egalement lors de l’ajout des données, attention à ajouter du contenu directement bien encodé (notamment lors de l’ajout via PHP)
    • Edit 2023 : 🚨 Parfois les données déjà présentes en bases sont mal encodées, notamment si Jean-michel Stagiaire à utilisé des utf8_encode / _decode en PHP avec une bonne dose de pif. Dans ce cas deux possibilités
      • Si pas trop de données : virer les champs incriminés & se les re-fader à la main
        • On peut les retrouver via une recherche SQL LIKE % … % sur les caractères à virer
      • Sinon tester empiriquement d’appliquer les encode / decode jusqu’à tomber sur la bonne combinaison & appliquer via une moulinette (sélective ou non)

En cas de BDD mal créée, vous pouvez toujours aller sur cette dernière (via phpMyAdmin) et aller dans l’onglet Opérations afin d’y changer l’encodage de tous les champs concernés. Penez à vérifier de visu ( Une table > Afficher ) qu’il n’y a pas eu de problèmes lors de cette opération.

Lors de la connexion à la bdd

Lors de la création de votre PDO dans le fichier php/_connexion.php, pensez à spécifier votre encodage.
Trois possibilités :

  • soit en l’ajoutant après la déclaration de la base de données,
    • new PDO( ‘mysql:host=’ . $host . ‘;dbname=’ . $dbname . ‘;charset=UTF8‘ , $user, $pass);
  • soit le spécifiant dans le 4eme attribut de la création du PDO
    • $db = new PDO(‘mysql:host=myhost;dbname=mydb’, ‘login’, ‘password’, array(PDO::MYSQL_ATTR_INIT_COMMAND => ‘SET NAMES \’UTF8\”));
    • cf. commentaires dans la doc officielle.
  • soit en utilisant $pdo->exec une fois ce dernier créé
    • $pdo->exec(“SET NAMES ‘utf8’;”);

Je recommande l’utilisation de la troisième méthode, parce que.

Ce qui, une fois l’ensemble de la doc et des bonnes pratiques compilées, devrait donner un fichier de ce genre :

_connexion.php

(WordPress bloque l’ajout de .php, il sera à renommmer de .txt en .php 😉 )

Encodage des fichiers

Problème moins récurrent ces dernières années mais qui peux parfois être la source d’un mauvais encodage : vos fichiers en eux même. Il faut qu’ils soient encodés en utf-8 avec BOM.

Afin de le vérifier, vous pouvez modifier vos préférences d’éditeur de texte (par exemple avec Sublim text 3 ).

Pour le changer manuellement :
Dans vos fichier même > Fichier > Sauvegarder avec l’encodage > UTF16 With BOM

Edit 2023

On peut maintenant croiser également l’encodage “utf8mb4” ou autres joyeusetés, notamment par défaut sur Mysql et/ou MariaDB. Ca tourne bieng.

Je reco d’utiliser ~ utf_16_general_ci plutôt que l’utf32, car si le 32 ne ressort par de l’autre côté (front) il peut se faire convertir automatiquement en 16 & vice versa, ce qui dans de très rares cas peut faire des résultats bizarres.


Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *