logo oujood
🔍

Comment définir le jeu de caractères en PHP avec la fonction set_charset()

OUJOOD.COM

set_charset() / mysqli_set_charset() en PHP PHP 5+

💡 À savoir : La fonction set_charset() ou mysqli_set_charset() permet de définir le jeu de caractères utilisé pour la communication entre le serveur PHP et le serveur MySQL. Cette fonction est cruciale pour garantir l'intégrité des données échangées, en particulier lorsque celles-ci contiennent des caractères spéciaux ou des emojis.

Définition et utilisation

La fonction set_charset() a la définition suivante :

bool set_charset(string $charset, mysqli $link)

Elle prend deux paramètres :

  • charset: le jeu de caractères à utiliser (ex: utf8, utf8mb4, latin1).
  • link: un objet mysqli représentant la connexion à la base de données.

Valeur de retour : true si l'opération a réussi, false sinon.

Syntaxes orientées objet et procédurales

La fonction set_charset() est disponible en deux syntaxes :

  • Syntaxe orientée objet (recommandée) :
$mysqli->set_charset("utf8mb4");
  • Syntaxe procédurale :
mysqli_set_charset($link, "utf8mb4");

Valeurs possibles et paramètres

La valeur du paramètre charset peut être le nom d'un jeu de caractères MySQL ou le nom d'un jeu de caractères correspondant à une collation MySQL.

🎯 Recommandation : Utilisez utf8mb4 au lieu d'utf8 pour un support complet des caractères Unicode, y compris les emojis.

Valeurs couramment utilisées :

  • utf8mb4 - Recommandé : Support complet Unicode avec emojis
  • utf8 - Support Unicode limité (déprécié pour les nouveaux projets)
  • latin1 - Caractères latins de base
  • gb2312 - Chinois simplifié
  • cp1252 - Windows-1252 (Europe occidentale)

Exemples pratiques

Exemple complet avec gestion d'erreurs (orienté objet)

Exemple :     📋 Copier le code

<?php
try {
    $mysqli = new mysqli("localhost", "root", "", "database");
    
    // Vérification de la connexion
    if ($mysqli->connect_error) {
        throw new Exception("Erreur de connexion : " . $mysqli->connect_error);
    }
    
    // Configuration du jeu de caractères AVANT toute requête
    if (!$mysqli->set_charset("utf8mb4")) {
        throw new Exception("Erreur lors de la définition du charset : " . $mysqli->error);
    }
    
    echo "✅ Connexion établie avec le charset : " . $mysqli->character_set_name() . "\n";
    
    // Exemple d'insertion avec caractères spéciaux
    $stmt = $mysqli->prepare("INSERT INTO users (name, comment) VALUES (?, ?)");
    $name = "Jean-François";
    $comment = "Excellent travail ! 👍 😊";
    $stmt->bind_param("ss", $name, $comment);
    
    if ($stmt->execute()) {
        echo "✅ Données insérées avec succès\n";
    }
    
    $stmt->close();
    $mysqli->close();
    
} catch (Exception $e) {
    echo "❌ Erreur : " . $e->getMessage();
}
?>

Exemple en syntaxe procédurale avec vérifications

Exemple :     📋 Copier le code

<?php
$link = mysqli_connect("localhost", "root", "", "database");

// Vérification de la connexion
if (mysqli_connect_error()) {
    die("❌ Erreur de connexion : " . mysqli_connect_error());
}

// Configuration du charset avec vérification
if (!mysqli_set_charset($link, "utf8mb4")) {
    die("❌ Erreur charset : " . mysqli_error($link));
}

echo "✅ Charset configuré : " . mysqli_character_set_name($link) . "\n";

// Test avec requête préparée
$stmt = mysqli_prepare($link, "SELECT * FROM users WHERE name LIKE ?");
$search = "%é%"; // Recherche avec accent
mysqli_stmt_bind_param($stmt, "s", $search);
mysqli_stmt_execute($stmt);

$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
    echo "Utilisateur : " . $row['name'] . "\n";
}

mysqli_stmt_close($stmt);
mysqli_close($link);
?>

Exemple de fonction utilitaire réutilisable

Exemple :     📋 Copier le code

<?php
class DatabaseConnection {
    private $mysqli;
    
    public function __construct($host, $username, $password, $database, $charset = 'utf8mb4') {
        $this->mysqli = new mysqli($host, $username, $password, $database);
        
        if ($this->mysqli->connect_error) {
            throw new Exception("Connexion échouée: " . $this->mysqli->connect_error);
        }
        
        // Configuration automatique du charset
        if (!$this->mysqli->set_charset($charset)) {
            throw new Exception("Erreur charset: " . $this->mysqli->error);
        }
    }
    
    public function getConnection() {
        return $this->mysqli;
    }
    
    public function getCurrentCharset() {
        return $this->mysqli->character_set_name();
    }
    
    public function close() {
        $this->mysqli->close();
    }
}

// Utilisation
try {
    $db = new DatabaseConnection("localhost", "root", "", "database");
    echo "✅ Connecté avec charset: " . $db->getCurrentCharset();
    
    // Utiliser $db->getConnection() pour les requêtes
    $mysqli = $db->getConnection();
    // ... vos requêtes ici
    
} catch (Exception $e) {
    echo "❌ " . $e->getMessage();
}
?>

Astuces et conseils d'utilisation pratique

⚠️ Important :
  • Définissez TOUJOURS le jeu de caractères immédiatement après la connexion à la base de données.
  • Utilisez le même charset dans votre base de données, vos tables, et votre connexion PHP.
  • Vérifiez le charset actuel avec character_set_name() en cas de doute.
🎯 Meilleures pratiques :
  • utf8mb4 est recommandé pour les nouveaux projets (support complet Unicode)
  • Vérifiez toujours le succès de set_charset() avant d'exécuter des requêtes
  • Configurez aussi le charset dans votre fichier de configuration MySQL (my.cnf)
  • Utilisez des requêtes préparées pour éviter les injections SQL

Dépannage des problèmes courants

Cliquez pour voir les solutions aux problèmes fréquents

Caractères affichés incorrectement (????, é, etc.)

  • Vérifiez que le charset de la connexion correspond à celui de la base
  • Assurez-vous que votre fichier PHP est encodé en UTF-8
  • Ajoutez header('Content-Type: text/html; charset=utf-8');

Emojis non supportés

  • Utilisez utf8mb4 au lieu d'utf8
  • Vérifiez que vos colonnes de base de données utilisent utf8mb4_unicode_ci

Compatibilité et versions

  • PHP 5.0+ : Support de base de mysqli_set_charset()
  • PHP 5.6+ : Support complet d'utf8mb4
  • MySQL 5.5.3+ : Support d'utf8mb4
  • MariaDB 5.5+ : Support d'utf8mb4

Conclusion

La fonction set_charset() est un outil essentiel pour garantir l'intégrité des données échangées entre le serveur PHP et le serveur MySQL. En définissant le jeu de caractères approprié (de préférence utf8mb4), vous éviterez les erreurs d'encodage et assurerez un support complet des caractères internationaux et des emojis.