Recherche…


Remarques

  • Vous devez vous assurer que chaque fois que vous traitez une chaîne UTF-8, vous le faites en toute sécurité. C'est malheureusement la partie la plus difficile. Vous voudrez probablement utiliser largement l'extension mbstring de PHP.

  • Les opérations de chaîne intégrées de PHP ne sont pas sécurisées par défaut avec UTF-8. Il y a certaines choses que vous pouvez faire en toute sécurité avec les opérations sur les chaînes PHP normales (comme la concaténation), mais pour la plupart des choses, vous devez utiliser la fonction mbstring équivalente.

Contribution

  • Vous devez vérifier chaque chaîne reçue comme étant UTF-8 valide avant d'essayer de la stocker ou de l'utiliser partout. mb_check_encoding() de PHP fait l'affaire, mais vous devez l'utiliser systématiquement. Il n'y a vraiment aucun moyen de contourner cela, car les clients malveillants peuvent soumettre des données quel que soit l'encodage souhaité.

    $string = $_REQUEST['user_comment'];
    if (!mb_check_encoding($string, 'UTF-8')) {
        // the string is not UTF-8, so re-encode it.
        $actualEncoding = mb_detect_encoding($string);
        $string = mb_convert_encoding($string, 'UTF-8', $actualEncoding);
    }
    
  • Si vous utilisez HTML5, vous pouvez ignorer ce dernier point. Vous voulez que toutes les données envoyées par les navigateurs soient dans UTF-8. La seule façon fiable de le faire est d’ajouter l’attribut accept-charset à toutes les balises <form> comme suit:

    <form action="somepage.php" accept-charset="UTF-8">
    

Sortie

  • Si votre application transmet du texte à d'autres systèmes, ils devront également être informés du codage des caractères. En PHP, vous pouvez utiliser l'option default_charset dans php.ini ou émettre manuellement l'en Content-Type tête Content-Type MIME. C'est la méthode préférée pour cibler les navigateurs modernes.

    header('Content-Type: text/html; charset=utf-8');
    
  • Si vous ne parvenez pas à définir les en-têtes de réponse, vous pouvez également définir le codage dans un document HTML contenant des métadonnées HTML .

    • HTML5

      <meta charset="utf-8">
      
    • Anciennes versions de HTML

      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      

Stockage de données et accès

Ce sujet traite spécifiquement de UTF-8 et des considérations relatives à son utilisation avec une base de données. Si vous souhaitez plus d'informations sur l'utilisation des bases de données en PHP, consultez cette rubrique .

Stockage de données dans une base de données MySQL:

  • Spécifiez le utf8mb4 caractères utf8mb4 sur toutes les tables et colonnes de texte de votre base de données. Cela permet à MySQL de stocker et de récupérer physiquement les valeurs encodées en mode natif dans UTF-8.

    MySQL utilisera implicitement l'encodage utf8mb4 si un utf8mb4_* est spécifié (sans jeu de caractères explicite).

  • Les anciennes versions de MySQL (<5.5.3) ne supportent pas utf8mb4 , vous serez donc obligé d'utiliser utf8 , qui ne supporte qu'un sous-ensemble de caractères Unicode.

Accéder aux données dans une base de données MySQL:

  • Dans votre code d'application (par exemple, PHP), quelle que soit la méthode d'accès à la base de données que vous utilisez, vous devrez définir le charset de connexion sur utf8mb4 . De cette façon, MySQL ne fait aucune conversion de son UTF-8 natif lorsqu'il transmet des données à votre application et inversement.

  • Certains pilotes fournissent leur propre mécanisme de configuration du jeu de caractères de connexion, qui à la fois met à jour son propre état interne et informe MySQL du codage à utiliser sur la connexion. C'est généralement l'approche privilégiée.

    Par exemple (la même considération concernant utf8mb4 / utf8 s'applique comme ci-dessus):

    • Si vous utilisez la couche d'abstraction PDO avec PHP ≥ 5.3.6, vous pouvez spécifier charset dans le DSN :

      $handle = new PDO('mysql:charset=utf8mb4');
      
    • Si vous utilisez mysqli , vous pouvez appeler set_charset() :

      $conn = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
      
      $conn->set_charset('utf8mb4');        // object oriented style
      mysqli_set_charset($conn, 'utf8mb4'); // procedural style
      
    • Si vous êtes bloqué avec un simple mysql mais que vous utilisez PHP ≥ 5.2.3, vous pouvez appeler mysql_set_charset .

      $conn = mysql_connect('localhost', 'my_user', 'my_password');
      
      $conn->set_charset('utf8mb4');       // object oriented style
      mysql_set_charset($conn, 'utf8mb4'); // procedural style
      
    • Si le pilote de base de données ne fournit pas son propre mécanisme pour définir le jeu de caractères de connexion, vous devrez peut-être envoyer une requête à MySQL pour savoir comment votre application s'attend à ce que les données de la connexion soient codées: SET NAMES 'utf8mb4' .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow