Vous mélangez des API ici,
mysql_*
etmysqli_*
ne se mélange pas. Vous devriez vous en tenir àmysqli_
(comme il semble que vous l'êtes de toute façon), commemysql_*
les fonctions sont obsolètes et entièrement supprimées dans PHP7.
Votre problème réel est un problème de jeu de caractères quelque part. Voici quelques conseils qui peuvent vous aider à obtenir le bon jeu de caractères pour votre application. Cela couvre la plupart des problèmes généraux auxquels on peut être confronté lors du développement d'une application PHP/MySQL.
- TOUS les attributs de votre application doivent être définis sur UTF-8
- Enregistrez le document au format UTF-8 sans BOM (si vous utilisez Notepad++, c'est
Format
->Convert to UTF-8 w/o BOM
) -
L'en-tête en PHP et HTML doit être défini sur UTF-8
-
HTML (à l'intérieur de
<head></head>
balises) :<meta charset="UTF-8">
-
PHP (en haut de votre fichier, avant toute sortie) :
header('Content-Type: text/html; charset=utf-8');
-
-
Lors de la connexion à la base de données, définissez le jeu de caractères sur UTF-8 pour votre objet de connexion, comme ceci (directement après la connexion)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */
Ceci est pour
mysqli_*
, il en existe des similaires pourmysql_*
et AOP (voir en bas de cette réponse). -
Assurez-vous également que votre base de données et vos tables sont définies sur UTF-8, vous pouvez le faire comme ceci :
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(Toutes les données déjà stockées ne seront pas converties dans le jeu de caractères approprié, vous devrez donc le faire avec une base de données propre ou mettre à jour les données après cela s'il y a des caractères cassés).
- Si vous utilisez
json_encode()
, vous devrez peut-être appliquer leJSON_UNESCAPED_UNICODE
flag, sinon il convertira les caractères spéciaux en leur équivalent hexadécimal.
N'oubliez pas que TOUT dans l'ensemble de votre pipeline de code doit être défini sur UFT-8, sinon vous risquez de rencontrer des caractères brisés dans votre application.
En plus de cette liste, il peut y avoir des fonctions qui ont un paramètre spécifique pour spécifier un jeu de caractères. Le manuel vous en parlera (un exemple est htmlspecialchars()
).
Il existe également des fonctions spéciales pour les caractères multi-octets, exemple :strtolower()
ne diminuera pas les caractères multi-octets, pour cela vous devrez utiliser mb_strtolower()
, regardez cette démo en direct
.
Remarque 1 :Notez que c'est noté quelque part comme
utf-8
(avec un tiret), et quelque part commeutf8
(sans ça). Il est important que vous sachiez quand utiliser lequel, car ils ne sont généralement pas interchangeables. Par exemple, HTML et PHP veulentutf-8
, mais pas MySQL.Remarque 2 :Dans MySQL, "charset" et "collation" ne sont pas la même chose, voir Différence entre l'encodage et la collation ? . Les deux doivent cependant être définis sur utf-8 ; généralement, le classement doit être soit
utf8_general_ci
ouutf8_unicode_ci
, voir UTF-8 :général ? Poubelle? Unicode ? .Remarque 3 :Si vous utilisez des emojis, MySQL doit être spécifié avec un
utf8mb4
charset au lieu du standardutf8
, à la fois dans la base de données et dans la connexion. HTML et PHP auront justeUTF-8
.
Configurer UTF-8 avec mysql_
et AOP
-
AOP :Cela se fait dans la DSN de votre objet. Notez le
charset
attribut,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
-
mysql_
:Cela se fait de manière très similaire àmysqli_*
, mais il ne prend pas l'objet de connexion comme premier argument.mysql_set_charset('utf8');