"Pourquoi mon Emoji est-il un Point d'Interrogation ?"
Nous sommes en 2026, et l'encodage de caractères hante toujours les développeurs. Vous sauvegardez un emoji dans votre base de données, et il revient comme ???? ou 😂.
Bienvenue dans le monde merveilleux de l'encodage.
Ce guide n'est pas une leçon d'histoire sur ASCII. C'est un guide pratique de survie pour gérer le texte dans les applications modernes.
Les Bases : Unicode vs UTF-8
C'est là que 90% de la confusion réside.
-
Unicode est une liste. C'est une feuille de calcul géante qui assigne un numéro unique (Code Point) à chaque caractère de chaque langue (et emoji).
- A =
U+0041 - € =
U+20AC - 😂 =
U+1F602
- A =
-
UTF-8 est une façon de stocker ces numéros. C'est l'encodage. Il décide comment transformer
U+1F602en octets (0 et 1) sur votre disque.
Pourquoi UTF-8 a gagné ? Il est à longueur variable.
- A = 1 octet (comme ASCII, super efficace)
- € = 3 octets
- 😂 = 4 octets
UTF-16 (utilisé par Java et Windows) utilise au moins 2 octets pour tout. Donc "hello" prend deux fois plus de place en UTF-16 qu'en UTF-8.
Le Piège MySQL (utf8 vs utf8mb4)
Si vous utilisez MySQL ou MariaDB, vous êtes probablement tombé dans ce piège.
Dans MySQL, le charset appelé utf8 n'est pas du vrai UTF-8.
Il ne supporte que 3 octets maximum.
Rappelez-vous : Les emojis (😂) nécessitent 4 octets.
Si vous essayez de sauvegarder un emoji dans une colonne MySQL utf8, il sera tronqué ou corrompu.
La Solution :
Utilisez toujours, toujours utf8mb4. C'est le vrai UTF-8 de MySQL.
SQL-- Le bon chemin (2026) CREATE DATABASE my_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Déboguer "Mojibake" (Texte Brouillé)
Vous voyez ceci : L’internationalisation
Au lieu de : L'internationalisation
C'est du Mojibake. Cela arrive quand vous :
- Avez du texte encodé en UTF-8 (l'apostrophe est
0xE2 0x80 0x99) - Mais votre logiciel pense que c'est du Windows-1252 (ou Latin-1).
En Windows-1252 :
0xE2= â0x80= €0x99= ™
Solution : Vérifiez la chaîne complète.
- Navigateur :
<meta charset="utf-8">dans le head HTML. - Connexion DB : Assurez-vous que votre pilote se connecte avec UTF-8.
- Fichier : Sauvegardez vos fichiers sources en UTF-8 (pas ANSI).
Longueur de Chaîne JavaScript (Le Piège Emoji)
En JS, les chaînes sont en UTF-16. Cela cause des maux de tête pour la longueur.
JavaScript1const str = "A"; 2console.log(str.length); // 1 3 4const emoji = "😂"; 5console.log(emoji.length); // 2 ! (Quoi ?)
Pourquoi ? Parce que 😂 nécessite 4 octets, et JS (UTF-16) utilise des "paires de substitution" (deux unités de 2 octets) pour représenter cela.
Si vous limitez les tweets à 140 "caractères" en utilisant .length, les utilisateurs d'emojis seront fâchés.
La Solution 2026 :
Utilisez l'itérateur de chaîne (qui est conscient d'Unicode) ou Array.from.
JavaScriptconst emoji = "😂"; console.log([...emoji].length); // 1 (Correct !) console.log(Array.from(emoji).length); // 1
Checklist pour 2026
- Fichiers : Tout en UTF-8 sans BOM.
- HTML :
<meta charset="utf-8">est la toute première ligne du<head>. - Base de données :
utf8mb4pour MySQL. UTF-8 par défaut pour Postgres (vous êtes en sécurité). - API : Renvoyez
Content-Type: application/json; charset=utf-8. - Validation : Ne faites pas confiance à
string.lengthpour les limites d'entrée utilisateur. Comptez les points de code Unicode.
Faites tout ça, et vos emojis 😂 se sentiront chez eux.
