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
dansphp.ini
ou émettre manuellement l'enContent-Type
têteContent-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èresutf8mb4
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 unutf8mb4_*
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'utiliserutf8
, 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'
.