Base64

7 tools

Qu'est-ce que l'encodage ?

L'encodage est le processus de conversion de données d'une représentation à une autre. Dans le développement Web, l'encodage est utilisé pour transmettre des données en toute sécurité via des canaux conçus pour un jeu de caractères limité.

L'encodage de caractères définit comment les caractères textuels se mappent aux octets. L'encodage Base64 convertit les données binaires en texte ASCII. L'encodage URL rend le texte arbitraire sûr pour une utilisation dans les URL.

Histoire de l'encodage de caractères

L'encodage de caractères est le mappage entre les caractères et leurs représentations binaires :

ASCII1963
128 caractères

Code standard américain à 7 bits. 128 caractères : lettres anglaises, chiffres, ponctuation et codes de contrôle.

Latin-11987
256 caractères

ASCII étendu pour les langues d'Europe occidentale. Ajout de 128 caractères. Non adapté aux scripts non latins.

Unicode1991
149 186+ caractères

Jeu de caractères universel couvrant tous les systèmes d'écriture du monde. Définit des points de code pour plus de 149 000 caractères.

UTF-81993
Tout Unicode caractères

Encodage à largeur variable d'Unicode utilisant 1 à 4 octets par caractère. Compatible ASCII. L'encodage dominant sur le Web.

UTF-161996
Tout Unicode caractères

Encodage à largeur variable utilisant 2 ou 4 octets par caractère. Utilisé en interne par Windows, Java et les chaînes JavaScript.

UTF-322000
Tout Unicode caractères

Encodage à largeur fixe : toujours 4 octets par caractère. Rarement utilisé sur le Web.

Pourquoi UTF-8 a gagné

UTF-8 est devenu dominant car il est rétrocompatible avec ASCII, auto-synchronisant et économe en espace pour le texte latin. Tout document ASCII est un document UTF-8 valide.

Encodage Base64

Base64 convertit les données binaires en une représentation textuelle utilisant seulement 64 caractères ASCII imprimables. Nécessaire lorsque des données binaires doivent transiter par des canaux textuels.

Comment ça fonctionne

Base64 regroupe les octets d'entrée en blocs de 3 octets et encode chaque bloc en 4 caractères Base64. Si l'entrée n'est pas un multiple de 3 octets, des caractères de remplissage = sont ajoutés :

EntréeOctets hexBase64
"Man"77 61 6ETWFu
"Ma"4D 61TWE=
"M"4DTQ==

Les caractères = de remplissage indiquent combien d'octets manquaient pour compléter le dernier groupe de 3 octets. Le Base64 standard produit toujours une sortie dont la longueur est un multiple de 4.

Encodage URL

Les URL ne peuvent contenir qu'un ensemble limité de caractères ASCII sûrs. Tout caractère hors de cet ensemble doit être encodé en pourcentage.

L'encodage en pourcentage remplace chaque octet non sûr par % suivi de deux chiffres hexadécimaux représentant la valeur de cet octet.

Caractères couramment encodés

CaractèreEncodéNotes
Space%20Le plus courant ; utilisé dans les soumissions de formulaires comme + dans application/x-www-form-urlencoded
&%26Séparateur de chaîne de requête ; doit être encodé en valeur littérale
=%3DSéparateur clé-valeur dans les chaînes de requête ; encoder en données
+%2BInterprété comme espace dans application/x-www-form-urlencoded ; encoder pour conserver +
#%23Identifiant de fragment ; encoder en données littérales dans un chemin ou une requête
/%2FSéparateur de segment de chemin ; encoder en données littérales
:%3ASéparateur de schéma ; encoder dans les contextes de chemin et de requête
@%40Utilisé dans mailto: et auth ; encoder en données littérales

encodeURI vs encodeURIComponent

JavaScript fournit deux fonctions d'encodage aux portées différentes. encodeURI encode une URL complète. encodeURIComponent encode un composant d'URL — il encode tous les caractères sauf A-Z, a-z, 0-9, -, _, ., ~.

Où l'encodage apparaît dans le développement Web

Authentification HTTP de base

L'en-tête Authorization: Basic encode les identifiants sous forme de Base64(utilisateur:motdepasse). C'est un encodage de commodité, PAS de sécurité. Toujours utiliser HTTPS avec Basic Auth.

URI de données

Les URI de données intègrent le contenu de fichier directement dans HTML ou CSS : data:image/png;base64,.... Cela élimine les requêtes HTTP au prix d'une taille de document accrue.

Pièces jointes MIME

L'e-mail a été conçu pour l'ASCII 7 bits. Les pièces jointes binaires sont encodées en Base64 par MIME avant transmission.

Tokens JWT

Les tokens JWT utilisent l'encodage Base64url pour les trois parties, les rendant sûrs pour les URL.

Paramètres de chaîne de requête

Toutes les données fournies par l'utilisateur dans les chaînes de requête URL doivent être encodées en pourcentage.

Noms de domaine internationalisés

Les noms de domaine non ASCII sont encodés en Punycode (préfixe xn--) pour la compatibilité avec le système DNS.

Questions fréquentes

Base64 est-il une forme de chiffrement ?

Non. Base64 est un encodage, pas un chiffrement. C'est une transformation réversible sans clé secrète.

Pourquoi la sortie Base64 se termine-t-elle parfois par == ?

Base64 traite l'entrée par groupes de 3 octets. Si l'entrée n'est pas un multiple de 3, un remplissage = est ajouté.

Quelle est la différence entre Base64 et Base64url ?

Base64url est une variante sécurisée pour les URL qui remplace + par - et / par _, et omet généralement le remplissage =. Les JWT utilisent Base64url.

Quand utiliser encodeURI vs encodeURIComponent ?

Utiliser encodeURIComponent pour les valeurs individuelles. Utiliser encodeURI pour une chaîne URL complète où les caractères de structure URL doivent être préservés.

Pourquoi UTF-8 est-il meilleur qu'UTF-16 pour le Web ?

UTF-8 est compatible ASCII et économe en espace pour le texte latin. HTTP et HTML utilisent UTF-8 par défaut.

Qu'est-ce que l'encodage en pourcentage ?

L'encodage en pourcentage représente les caractères comme % suivi de leur valeur d'octet hexadécimale. Un espace est %20.

L'encodage affecte-t-il les performances ?

Base64 augmente la taille des données d'environ 33 % et ajoute une charge CPU. L'encodage URL ajoute une surcharge minimale.

Qu'est-ce que Punycode ?

Punycode est un encodage pour représenter les caractères Unicode dans le système DNS compatible ASCII. Les domaines comme münchen.de sont encodés en xn--mnchen-3ya.de.