Base64 : encoder et décoder texte, fichiers et images en ligne

Base64 : encoder et décoder texte, fichiers et images en ligne

Convertir du texte, un fichier ou une image en Base64 (et inversement) sans backend — data URI CSS, pièce jointe email, payload JWT. 100 % local.

18.09.2026
15 min de lecture
Partager cet article:
Base64
Encodage
Data URI
Tutoriel

Pourquoi Base64 revient dans chaque stack

Un background CSS qui ne peut pas fetcher un fichier, une pièce MIME qui doit voyager en ASCII, un segment JWT coincé entre deux points, une option WordPress sérialisée puis enveloppée en Base64 : aucun de ces cas n'est un problème de chiffrement. Ce sont des problèmes de transport. L'encodeur/décodeur Base64 en ligne transforme du texte Unicode en alphabet ASCII-safe et inversement, entièrement dans l'onglet. Le convertisseur image vers Base64 fait de même pour un PNG, JPEG, GIF, WebP ou SVG local — en data URI ou en Base64 brut. Rien n'est uploadé. Base64 n'est ni un hash, ni un chiffre, ni un substitut à TLS. C'est une façon de faire passer des octets dans des canaux qui n'aiment que lettres, chiffres, +, / et le padding. Le cluster vit sur le hub outils d'encodage.

Aller-retour UTF-8 pour le texte Unicode — accents, CJK, emoji — pas le piège du btoa natif
Mode URL-safe (RFC 4648) : - et _ à la place de + et /, padding omis — l'alphabet réel des JWT
Le décodage ignore les espaces, donc les lignes MIME repliées et les segments JWT copiés passent encore
Outil image : PNG, JPEG, GIF, WebP, SVG, 32 Mio, data URI ou Base64 brut, aperçu via img uniquement
100 % local — la chaîne ne quitte pas le navigateur
Enchaînez avec JWT decode, URL encode, entités HTML, data URI SVG, formateur JSON

Quand encoder dans le navigateur, et quand s'en passer

Bons cas

L'encodeur est un scalpel pour une chaîne que vous pouvez coller, pas un CDN.

Lire un header ou payload JWT, ou décoder une ligne MIME repliée, sans ouvrir un REPL
Construire une petite data URI CSS pour une icône déjà optimisée
Vérifier qu'un backend Base64 suit UTF-8 (café, emoji) plutôt qu'un mensonge Latin-1
Retirer une enveloppe Base64 d'un blob WordPress ou Laravel avant unserialize
Enseigner la différence entre encodage, hash et chiffrement avec un aller-retour immédiat
Laissez ça au pipeline

Si la réponse dépend d'un fichier que le navigateur ne devrait pas tenir, ou de la crypto, restez en CI ou dans un gestionnaire de secrets.

Images hero de production, photos produit, ou tout asset où 33 % de CSS en plus coûte plus cher qu'une requête HTTP
Secrets — Base64 ne les cache pas ; utilisez un coffre, pas un encodeur
Stockage de mots de passe — hasher (bcrypt/Argon2), jamais encoder
HEIC, PDF, ou fichiers au-dessus de 32 Mio — hors scope d'image-to-base64
Vérifier une signature JWT contre un JWKS — <a href="/fr/jwt-verify" class="text-primary hover:underline">jwt-verify</a>, pas décoder et croiser les doigts

Les erreurs Base64 qui coûtent un après-midi

Appeler encodage un chiffrement

Quiconque lit la chaîne peut la décoder. Base64 n'a ni clé, ni contrôle d'intégrité, ni confidentialité. Un jeton qui paraît opaque dans un log reste du clair après un décodage. Si les octets doivent rester secrets, chiffrez (ou ne les mettez pas dans le payload). S'ils doivent rester authentiques, signez — HMAC ou signature JWT, pas Base64 lui-même.

Livrer une clé API en Base64 et l'appeler « obfusquée »
Stocker des mots de passe en Base64 au lieu d'un hash (bcrypt, Argon2)
Croire qu'une data URI cache l'asset à qui ouvre le code source
Confondre Base64 et SHA-256 : un digest est à sens unique ; Base64 est réversible par conception
Mélanger Base64 standard et Base64URL

RFC 4648 définit deux alphabets. Le Base64 standard utilise + et / et garde en général le padding =. Le Base64 URL-safe (JWT, cookies, chemins) utilise - et _ et omet typiquement le padding. L'option URL-safe de FastMinify fait les deux substitutions et retire le padding à l'encodage. En décodage URL-safe, l'alphabet est remappé et le padding restauré. Si l'option ne correspond pas à la chaîne, vous obtenez une erreur d'entrée invalide — pas un décodage « à peu près ».

Coller un segment JWT avec - et _ alors que URL-safe est désactivé
S'attendre à ce que le mode standard accepte une chaîne privée de son padding =
Copier le payload d'une data URI (alphabet standard, avec padding) dans un champ JWT
Remplacer + par - à la main quelque part et oublier / → _
Coller un JWT entier dans le décodeur texte

Un JWT compact, c'est trois segments Base64URL séparés par des points : header.payload.signature. Les points ne sont pas du Base64. L'outil Base64 décode une chaîne d'alphabet, pas un jeton à points. Le message d'erreur de la page le dit : collez seulement les caractères encodés, sans points ; pour un JWT, copiez chaque partie entre les points — ou, plus simple, ouvrez le décodeur JWT et inspectez header plus payload en une étape.

Coller eyJhbGciOi… d'un seul bloc, points compris
Décoder le segment signature comme du texte UTF-8 et attendre un JSON lisible
Utiliser jwt-decode alors que vous n'avez qu'un blob Base64 sans forme header.payload.signature
Oublier que jwt-decode lit des claims — ce n'est pas jwt-verify contre un JWKS
Inliner une photo en data URI dans le CSS de production

Base64 gonfle les données binaires d'environ 33 % (3 octets deviennent 4 caractères ASCII). Un JPEG de 200 Kio devient ~267 Kio de CSS. Ce CSS n'a pas de cache séparé, bloque le parsing, et se bat contre le multiplexage HTTP/2. Les data URI gagnent pour les icônes minuscules qui coûteraient autrement une requête. Elles perdent pour les visuels hero, les photos produit, et tout ce que vous minifiez déjà comme fichier.

Déposer un PNG de 2 Mio dans image-to-base64 et coller le résultat dans une feuille de style
S'attendre à ce qu'une data URI se compresse mieux que le fichier original sous Brotli — l'alphabet est plus dense, pas plus petit
Sauter le <a href="/fr/blog/guide-optimisation-svg-web" class="text-primary hover:underline">guide d'optimisation SVG</a> avant d'inliner un SVG exporté
Utiliser l'outil Base64 texte sur une image binaire : il encode du texte Unicode, pas des octets de fichier

Base64 standard, URL-safe, data URI — choisir la représentation

Trois sorties, une famille d'alphabets

Les octets ne changent pas. L'orthographe si. Le Base64 standard est ce qu'émettent le MIME email et la plupart des API. Le Base64 URL-safe est ce dont ont besoin JWT, cookies signés et segments de chemin pour que + et / ne collisionnent pas avec la syntaxe de requête. Une data URI, c'est du Base64 standard avec le préfixe data:&lt;mime&gt;;base64, pour qu'un navigateur traite la chaîne comme une ressource.

Standard : A–Z a–z 0–9 + / et padding = — sortie brute image-to-base64, la plupart des docs et bases
URL-safe : A–Z a–z 0–9 - _ , padding omis — toggle de l'outil texte ; orthographe header/payload JWT
Data URI : data:image/png;base64,iVBOR… — sortie par défaut image-to-base64, CSS url(), img src
Le préfixe n'est pas du Base64. Ne collez pas data:image/… dans le décodeur texte ; retirez-le ou utilisez l'outil image
Outil texte vs image-to-base64 vs data URI SVG

Trois outils, trois entrées. L'encodeur texte enchaîne UTF-8 puis Base64 sur une chaîne (collage ou fichier texte). Il n'interprète pas un PNG comme des pixels. Le convertisseur image lit les octets du fichier, vérifie le MIME (PNG, JPEG, GIF, WebP, SVG — MIME vide refusé, pas de sniff silencieux), plafonne à 32 Mio, et émet une data URI ou du Base64 brut. L'aperçu passe par un élément img uniquement : le SVG n'est jamais injecté dans le DOM comme markup. Pour un SVG-as-CSS avec choix utf-8 ou Base64 et un snippet CSS dédié, utilisez SVG vers data URI sur le hub SVG (entrée SVG 512 Kio — un autre plafond, un autre métier).

Chaîne Unicode, blob JSON, segment JWT, snippet de config → /base64
Fichier raster ou SVG local que vous voulez en data:image/… → /image-to-base64
Source SVG que vous voulez en CSS url() avec choix d'encodage → /svg-to-data-uri
Percent-encoder une valeur de query n'est pas du Base64 — c'est /url-encode
Base64 n'est ni URL-encode, ni entités HTML, ni un hash

On mélange ces outils parce qu'ils « rendent une chaîne plus sûre ». Ils résolvent des collisions différentes. URL encode percent-encode les caractères réservés d'une URI. Les entités HTML échappent le markup pour qu'une chaîne tienne dans un attribut. Un hash (SHA-256, HMAC) est de l'intégrité ou de l'authenticité à sens unique — voir hash/HMAC sur le hub encodage, pas cet article. Base64 ne change que la façon d'écrire les octets.

Besoin d'une chaîne dans un paramètre de query → URL encode, pas Base64
Besoin d'une chaîne dans du HTML sans casser la balise → entités HTML
Besoin de détecter une altération → hash ou HMAC, puis éventuellement Base64 du digest pour le transport
Besoin d'octets ASCII-safe dans du JSON, un email ou une data URI → Base64

Ce que Base64 fait vraiment à vos octets

Un alphabet de 64 caractères et une taxe de 33 %

Base64 prend 24 bits (3 octets) et les écrit en 4 caractères d'un alphabet à 64 symboles. C'est pourquoi la sortie est plus longue : 4/3, environ 33 % de plus, plus le padding si la longueur d'entrée n'est pas un multiple de 3. La taxe est le but — vous échangez de la taille contre un alphabet qui survit à l'email, aux chaînes JSON et au CSS. C'est l'inverse de la minification. Si le payload est du JSON que vous livrez en HTTP, minifiez le JSON d'abord, puis n'encodez que si une couche d'enveloppe exige de l'ASCII ; voir le guide de minification JSON.

Avant

foo

Après

Zm9v
3 octets d'entrée → 4 caractères de sortie ; 1 octet restant → 2 caractères + == ; 2 octets restants → 3 caractères + =
L'alphabet est ASCII : il survit au copier-coller, au YAML et aux logs qui abîment le binaire
Les espaces dans la chaîne encodée sont ignorés au décodage dans FastMinify — le MIME replie souvent à 76 caractères
L'expansion porte sur la forme encodée. Gzip/Brotli sur une data URI dans du HTML est moins efficace que gzip sur le fichier original
UTF-8 d'abord, puis Base64

Le btoa natif de JavaScript opère sur une chaîne binaire (valeurs 0–255). Passez-lui café et il lève une exception ou produit un mensonge, selon le moteur. FastMinify encode les octets UTF-8 avec TextEncoder, puis Base64 — le même contrat que Node Buffer.from(text, 'utf8').toString('base64'). Le décodage inverse avec TextDecoder. Emoji et CJK survivent. Si vous décodez un blob qui n'a jamais été du texte UTF-8 (un PNG, un flux gzip), vous obtenez des caractères de remplacement, pas un fichier — ce blob va dans image-to-base64 ou un dump hex, pas dans un champ texte.

Avant

café

Après

Y2Fmw6k=
café → Y2Fmw6k= (UTF-8 pour é = deux octets C3 A9)
Hello, 世界 → SGVsbG8sIOS4lueVjA==
btoa/atob natifs sans TextEncoder sont le piège Unicode classique — l'outil en ligne ne prend pas ce chemin
Images binaires : déposez le fichier sur image-to-base64 ; ne collez pas du « binaire » dans l'encodeur texte
Le padding, et pourquoi JWT le retire

Quand la longueur en octets n'est pas un multiple de 3, le Base64 standard ajoute = ou == pour que la longueur de chaîne soit un multiple de 4. Les contextes URL-safe (JWT, certains cookies) omettent ce padding parce que = est un délimiteur de query. L'encodage URL-safe FastMinify le retire ; le décodage URL-safe le remet avant atob. Exemples RFC classiques : fZg==, foZm8=, fooZm9v.

Avant

f

Après

Zg==
Décodage standard : un padding manquant peut échouer — collez les = ou activez URL-safe si le producteur les a omis
L'encodage URL-safe de +/8= devient -_8 (swap d'alphabet et padding retiré)
Un header JWT {"alg":"HS256","typ":"JWT"} s'encode en eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 — sans padding
N'ajoutez pas de padding à la main sur le payload d'une data URI sauf pour réparer une copie tronquée

Encoder dans l'onglet : texte, puis un fichier, puis une image

Encoder ou décoder une chaîne

Ouvrez l'encodeur/décodeur Base64. Collez le texte (ou uploadez un fichier texte — plafond client 32 Mio, même famille que les autres sélections de fichiers du site). Choisissez Encode ou Decode. Laissez URL-safe éteint pour MIME, les payloads data-URI et la plupart des exemples d'API. Activez-le pour les segments JWT, les cookies signés, et tout ce qui ira dans un chemin. Chargez l'exemple si vous voulez seulement voir le pipeline. Tout reste dans l'onglet.

1

Étape 1 — Coller ou uploader la source

Texte Unicode pour encoder ; une chaîne d'alphabet Base64 pour décoder. N'incluez ni les points d'un JWT ni un préfixe data:.

2

Étape 2 — Régler URL-safe selon le producteur

On : - _ et pas de padding. Off : + / et padding =. Un décalage est une erreur, pas un décodage partiel.

3

Étape 3 — Copier le résultat

Si vous avez décodé du JSON minifié, envoyez-le au formateur JSON ou au déminificateur JSON en ligne — format uniquement, les noms déjà perdus le restent.

Transformer une image locale en data URI

Ouvrez l'outil image vers Base64. Déposez un PNG, JPEG, GIF, WebP ou SVG (max 32 Mio). Choisissez data URI pour CSS url() et img src, ou Base64 brut pour enchaîner vers un autre outil. L'aperçu passe par un élément img ; le SVG n'est pas monté en DOM. Les MIME vides ou exotiques sont refusés — l'outil ne devine pas. Après une icône minuscule, vous pouvez coller l'URI dans le CSS. Après une photographie, en général non.

Types autorisés : image/png, image/jpeg, image/gif, image/webp, image/svg+xml — pas de PDF, pas de HEIC en v1
Plafond dur 32 Mio — les fichiers plus gros sont refusés ; il n'y a pas d'upload illimité
La sortie par défaut commence par data:&lt;mime&gt;;base64, — le mode brut retire le préfixe
SVG à optimiser d'abord : minify-svg / le guide d'optimisation SVG, puis encoder
Après Base64 : JWT, URL, JSON, PHP

L'encodage n'est souvent qu'une étape d'un debug plus long. Le hub encodage garde les voisins à un clic.

JWT compact : décoder un JWT (header + payload). Fabriquer un jeton de test avec JWT encode — toujours pas de vérification
Query strings : URL encode / URL decode — percent-encoding, autre alphabet
JSON décodé et minifié : formateur JSON, ou minifier JSON si vous compactez un payload d'API — voir aussi optimiser le JSON d'une API REST
Blob style WordPress : décoder Base64, puis désérialiser PHP si les octets internes sont un tableau PHP sérialisé — guide de sérialisation PHP
Vue hub : outils d'encodage · aussi sur outils utilitaires

Quand le navigateur suffit — et quand il faut encore un REPL

Node Buffer — le même contrat UTF-8

Si la chaîne vit déjà dans un script, le Buffer de Node suit le même chemin UTF-8 puis Base64 que FastMinify. Utilisez base64url quand le consommateur est une lib JWT.

Exemple de base

const { Buffer } = require('node:buffer') const encoded = Buffer.from('café', 'utf8').toString('base64') // Y2Fmw6k= const urlSafe = Buffer.from('café', 'utf8').toString('base64url') // Y2Fmw6k const roundTrip = Buffer.from(encoded, 'base64').toString('utf8') // café
TextEncoder navigateur — n'appelez pas btoa sur de l'Unicode

Le couple natif btoa / atob est une API de chaîne binaire. Enveloppez-le avec TextEncoder/TextDecoder, sinon tout ce qui sort du Latin-1 sera corrompu. C'est exactement l'enveloppe que l'outil texte FastMinify applique déjà.

Exemple de base

const bytes = new TextEncoder().encode('café') let binary = '' bytes.forEach((b) => { binary += String.fromCharCode(b) }) const encoded = btoa(binary) const decodedBytes = Uint8Array.from(atob(encoded), (c) => c.charCodeAt(0)) const text = new TextDecoder().decode(decodedBytes)
openssl pour un fichier sur disque

Un PEM local, une fixture binaire, ou un job CI qui ne doit pas ouvrir un navigateur : openssl reste le bon marteau. FastMinify ne remplace pas un pipeline qui hashe ou signe déjà des fichiers sur disque.

Exemple de base

openssl base64 -in icon.png -out icon.b64 openssl base64 -d -in icon.b64 -out icon.png
FastMinify base64 / image-to-base64

Pas d'install, pas d'upload, texte UTF-8 plus un convertisseur image dédié avec un plafond honnête de 32 Mio et une option URL-safe. Contrepartie : l'outil texte n'est pas un encodeur de fichier binaire ; HEIC/PDF hors scope de l'outil image ; la vérification JWT est une autre page. Servez-vous-en pour inspecter, enseigner, et débloquer une machine sans Node — puis gardez openssl ou Buffer en CI.

Conclusion

Base64 est un adaptateur ennuyeux et essentiel : des octets en entrée, un alphabet ASCII-safe en sortie, 33 % plus gros, entièrement réversible. FastMinify fait tourner cet adaptateur dans le navigateur — texte UTF-8 avec alphabet URL-safe optionnel, et un convertisseur image séparé (PNG, JPEG, GIF, WebP, SVG, 32 Mio) qui émet une data URI ou du Base64 brut sans injecter de SVG dans le DOM. Il ne chiffre pas, il ne hashe pas, et il ne remplace ni jwt-verify ni un CDN. Encodez le snippet, décodez la ligne de log, inlinez l'icône, puis arrêtez-vous. Commencez sur le hub outils d'encodage, et ouvrez JWT decode quand la chaîne a deux points.

Alignez URL-safe sur le producteur — segments JWT on, MIME et data URI off
Ne traitez jamais Base64 comme du chiffrement ni comme un hash de mot de passe
Utilisez image-to-base64 pour les fichiers ; l'outil texte est de l'Unicode, pas des pixels
N'inlinez des data URI que si l'asset est assez petit pour payer la taxe de 33 %
JWT entier → jwt-decode ; politique de signature → jwt-verify
Partager cet article
Partager cet article: