Réponse technique directe
Un point de code Unicode est une valeur numérique abstraite attribuée à un caractère dans l'espace de code universel (de U+0000 à U+10FFFF). Une unité de code est le conteneur physique de bits utilisé par un format d'encodage concret : 8 bits en UTF-8, 16 bits en UTF-16 et 32 bits en UTF-32.
Modèle mental : signification abstraite vs stockage physique
Pour éviter les bogues d'encodage et les erreurs de décalage d'un caractère (off-by-one), les ingénieurs logiciels doivent clairement séparer l'identité abstraite d'un caractère de sa représentation sérialisée.
Qu'est-ce qu'un point de code ?
Qu'est-ce qu'une unité de code ?
Pourquoi les méthodes de longueur des langages diffèrent
Comparaison des points de code et des unités de code pour l'emoji visage souriant U+1F600
// The Grinning Face character: 😀
// Unicode Code Point: U+1F600 (Hexadecimal: 0x1F600, Decimal: 128512)
// 1. In UTF-32 (Fixed 32-bit units): Exactly 1 code unit (4 bytes)
// [0x0001F600]
// 2. In UTF-16 (16-bit units): Exactly 2 code units (4 bytes)
// [0xD83D, 0xDE00] (High & Low Surrogate Pair)
console.log('😀'.length); // 2 UTF-16 code units
// 3. In UTF-8 (8-bit units): Exactly 4 code units (4 bytes)
// [0xF0, 0x9F, 0x98, 0x80] (4 individual byte octets)
console.log(new TextEncoder().encode('😀').length); // 4 UTF-8 bytes
2
4
Les trois formats de transformation Unicode comparés
Comment les trois formes d'encodage Unicode officielles sérialisent les points de code en unités de code.
UTF-8 : unités de code de 8 bits
UTF-16 : unités de code de 16 bits
UTF-32 : unités de code de 32 bits
Erreurs courantes vs modèles de production
Découvrez quels modèles échouent en production et leurs alternatives modernes conformes aux standards.
Valider la longueur maximale d'une chaîne
Validation de colonnes de base de données (p. ex. VARCHAR(20) contre limites d'octets).// In JavaScript:
if (input.length <= 10) {
// Bad! 10 emojis is 20 code units and 40 UTF-8 bytes!
saveToDb(input);
}
// Check UTF-8 byte length for network/database limits:
const byteLength = new TextEncoder().encode(input).length;
// Check user visual count for UI display:
const userChars = [...new Intl.Segmenter().segment(input)].length;
Matrice des cas limites et invariants
Une matrice de tests diversifiée comparant le comportement des caractères entre ASCII, signes combinants, emojis, drapeaux et fragments de substitution.
| Cas de test | Glyphe d'entrée | Unités de code | Points de code | Graphèmes | Catégorie | Explication technique |
|---|---|---|---|---|---|---|
| Lettre ASCII « A » | A |
1 (UTF-8) / 1 (UTF-16) / 1 (UTF-32)
|
1
|
1
|
ASCII | Tient dans un seul octet de 8 bits, un mot de 16 bits et un double mot de 32 bits. |
| Lettre hébraïque « א » | א |
2 (UTF-8) / 1 (UTF-16) / 1 (UTF-32)
|
1
|
1
|
BMP Script | U+05D0 nécessite 2 octets en UTF-8, mais seulement 1 unité de code en UTF-16. |
| Signe euro « € » | € |
3 (UTF-8) / 1 (UTF-16) / 1 (UTF-32)
|
1
|
1
|
BMP Symbol | U+20AC nécessite 3 octets en UTF-8 (E2 82 AC), mais 1 unité de code en UTF-16. |
| Emoji « 😀 » | 😀 |
4 (UTF-8) / 2 (UTF-16) / 1 (UTF-32)
|
1
|
1
|
Supplementary Plane | U+1F600 nécessite 4 octets en UTF-8, 2 unités de code en UTF-16 (paire de substitution) et 1 en UTF-32. |
Normes et provenance des sources
Tous les invariants techniques, API et comportements de ce guide sont vérifiés par rapport aux spécifications primaires officielles.
The Unicode Standard, Version 17.0
Clause : §2.4 Code Points and Characters & §3.9 Encoding Forms