btoa() attend une chaîne binaire dont chaque unité tient dans un octet. Il n’encode pas automatiquement le texte en UTF-8. Certains caractères Unicode provoquent InvalidCharacterError ; convertissez d’abord le texte en octets.
Encoder et décoder en UTF-8
TextEncoder produit les octets du texte. Le code ci-dessous les traite par blocs avant btoa, pour éviter une limite du nombre d’arguments. Pour le décodage, convertissez la sortie d’atob en Uint8Array puis utilisez TextDecoder. L’option fatal détecte les octets UTF-8 invalides.
Tester un aller-retour
안녕하세요 😀 donne 7JWI64WV7ZWY7IS47JqUIPCfmIA=. Le décodage doit restituer les mêmes espaces et caractères. Le lien d’exemple utilise un nom de démonstration fixe, sans placer votre texte dans l’URL. Decodex traite jusqu’à 5 MB de texte UTF-8 dans le navigateur.
Identifier la bonne erreur
Un échec d’atob indique généralement un problème d’alphabet, de remplissage ou de préfixe. Une erreur de TextDecoder peut indiquer des données binaires ou un autre encodage. Sous Node.js, Buffer.from(text, "utf8").toString("base64") convient à l’encodage ; un décodeur permissif ne remplace pas la validation.
Essayer cet exemple
// Browser JavaScript: text → UTF-8 bytes → Base64.
function utf8ToBase64(text) {
const bytes = new TextEncoder().encode(text);
let binary = '';
for (let i = 0; i < bytes.length; i += 8192) {
binary += String.fromCharCode(...bytes.subarray(i, i + 8192));
}
return btoa(binary);
}
// Accept standard Base64 or Base64URL, with complete or omitted padding.
function base64ToUtf8(value) {
let normalized = value.replace(/\s/g, '').replace(/-/g, '+').replace(/_/g, '/');
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(normalized) ||
normalized.length % 4 === 1 ||
(normalized.includes('=') && normalized.length % 4 !== 0)) {
throw new Error('Invalid Base64 characters, length or padding');
}
normalized += '='.repeat((4 - normalized.length % 4) % 4);
const binary = atob(normalized);
const bytes = Uint8Array.from(binary, character => character.charCodeAt(0));
return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
}
const text = '안녕하세요 😀';
const encoded = utf8ToBase64(text);
console.log(encoded); // 7JWI64WV7ZWY7IS47JqUIPCfmIA=
console.log(base64ToUtf8(encoded)); // 안녕하세요 😀
Questions fréquentes
atob restitue-t-il directement le texte Unicode ?
Non. Il renvoie une chaîne binaire. Convertissez ses valeurs en Uint8Array, puis lisez-les avec TextDecoder("utf-8"). Évitez les recettes anciennes utilisant unescape().
