Namnen atob och btoa kan föreslå vanlig textkonvertering. Deras webbläsarkontrakt är smalare: de konverterar mellan Base64 text och en sträng vars teckenvärden representerar enskilda byte. Den bytesträngen är en behållare, inte ett löfte om att resultatet är läsbar Unicode-text.
Två olika strängar
JavaScript strängar använder UTF-16 kodenheter. En bytesträng begränsar medvetet varje teckenvärde till 0–255. btoa('Hello') fungerar eftersom ASCII värden passar det intervallet. btoa('你好') misslyckas eftersom dessa tecken inte får plats i en byte. Även en karaktär som passar kan vara vilseledande: btoa('é') kodar den enda byten E9, inte de UTF-8 byte C3 A9 som förväntas av många tjänster.
console.log(btoa('é')); // 6Q== (byte E9)
console.log(btoa(String.fromCharCode(0xc3, 0xa9))); // w6k= (UTF-8)
Sätt UTF-8 omvandling runt bytefunktionerna
TextEncoder producerar UTF-8 byte från text. Efter avkodning av Base64, en dödlig TextDecoder konverterar giltiga UTF-8 byte tillbaka till text och avvisar ogiltiga sekvenser istället för att tyst ersätta dem. Detta lilla exempel är medvetet explicit så att gränsen är synlig.
const text = '中文😊';
const bytes = new TextEncoder().encode(text);
let binary = '';
for (const byte of bytes) binary += String.fromCharCode(byte);
const encoded = btoa(binary);
console.log(encoded); // 5Lit5paH8J+Yig==
const decodedBytes = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));
const decoded = new TextDecoder('utf-8', { fatal: true }).decode(decodedBytes);
console.log(decoded); // 中文😊
Behandla inte ett binärt resultat som en trasig sträng
atob('/w==') representerar byten FF. Det är inte giltigt UTF-8 i sig, men det är helt giltiga binära data. Rätt nästa åtgärd kan vara en byte-nedladdning eller hexadecimal vy, inte ett annat textkonverteringstrick. Kör igenom den bytesträngen TextEncoder skulle koda tecknet U+00FF och ändra byte.
Webbläsaravkodaren är inte heller en komplett protokollvalidator. Godkända blanksteg och utelämnad stoppning kan skilja sig från strikta applikationskrav. Om ett protokoll kräver kanonisk kodning, validera alfabet, utfyllnad och oanvända bitar separat. För stora filer, undvik att sprida en komplett byte-array till String.fromCharCode(...bytes); argumentantalgränser kan misslyckas långt innan filen blir ovanligt stor.
Läs webbläsaravtalen i MDN: atob() och MDN: btoa(). Applikationen bör avgöra om den vill ha en tillåten konvertering, en strikt validator eller ett filbevarande arbetsflöde, snarare än att anta att det är samma uppgift.