IntlPull
Technical
18 min read

Encodage de Caractères : Le Guide du Développeur 2026 (UTF-8, Unicode, & Emojis)

Pourquoi vos emojis sont-ils cassés ? Comprendre l'encodage de caractères, UTF-8 vs UTF-16, comment fonctionnent les bases de données, et comment éviter le mojibake dans les applications web modernes.

IntlPull Team
IntlPull Team
03 Feb 2026, 11:44 AM [PST]
On this page
Summary

Pourquoi vos emojis sont-ils cassés ? Comprendre l'encodage de caractères, UTF-8 vs UTF-16, comment fonctionnent les bases de données, et comment éviter le mojibake dans les applications web modernes.

"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.

  1. 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
  2. UTF-8 est une façon de stocker ces numéros. C'est l'encodage. Il décide comment transformer U+1F602 en 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 :

  1. Avez du texte encodé en UTF-8 (l'apostrophe est 0xE2 0x80 0x99)
  2. 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.

  1. Navigateur : <meta charset="utf-8"> dans le head HTML.
  2. Connexion DB : Assurez-vous que votre pilote se connecte avec UTF-8.
  3. 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.

JavaScript
1const 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.

JavaScript
const emoji = "😂";
console.log([...emoji].length); // 1 (Correct !)
console.log(Array.from(emoji).length); // 1

Checklist pour 2026

  1. Fichiers : Tout en UTF-8 sans BOM.
  2. HTML : <meta charset="utf-8"> est la toute première ligne du <head>.
  3. Base de données : utf8mb4 pour MySQL. UTF-8 par défaut pour Postgres (vous êtes en sécurité).
  4. API : Renvoyez Content-Type: application/json; charset=utf-8.
  5. Validation : Ne faites pas confiance à string.length pour les limites d'entrée utilisateur. Comptez les points de code Unicode.

Faites tout ça, et vos emojis 😂 se sentiront chez eux.

Tags
encoding
utf-8
unicode
emoji
database
web-development
IntlPull Team
IntlPull Team
Engineering

Building tools to help teams ship products globally. Follow us for more insights on localization and i18n.