En browserklient og en Node.js-tjeneste bør producere den samme Base64 for de samme bytes. De behøver ikke bruge den samme API for at gøre det. Den vigtige aftale er byte-repræsentationen af tekst, alfabetet og behandlingen af udfyldning og ugyldig input.
Browser: gør trinnet UTF-8 eksplicit
De traditionelle browserfunktioner fungerer på byte-strenge. Konverter Unicode-tekst med TextEncoder, og indkod derefter disse bytes. På returstien skal du rekonstruere et byte-array og afkode UTF-8 eksplicit. Dette eksempel bruger en loop for at undgå at udvide et stort array til funktionsargumenter, selvom en produktionsfilkoder stadig skal bruge afgrænsede bidder eller en passende byte API.
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); // 中文😊
Node.js: hold Buffer ved bytegrænsen
Buffer.from(text, 'utf8') gør tekstkodningen synlig. Ringer toString('base64') repræsenterer derefter disse bytes. Afkodning til en Buffer bevarer binære data; konvertering med det samme til en UTF-8 streng er kun passende, når nyttelasten vides at være tekst.
import { Buffer } from 'node:buffer';
const encoded = Buffer.from('中文😊', 'utf8').toString('base64');
console.log(encoded); // 5Lit5paH8J+Yig==
const bytes = Buffer.from(encoded, 'base64');
console.log(new TextDecoder('utf-8', { fatal: true }).decode(bytes)); // 中文😊
Den fatale TextDecoder i eksemplet er bevidst. Almindelig Buffer UTF-8 strengkonvertering kan indsætte erstatningstegn for ugyldig input. En vellykket tekstvisning ville så skjule, at de originale bytes ikke kunne repræsenteres trofast.
Aftal validering separat
Nodes Base64 dekoder accepterer nogle inputformularer, som en strengere ansøgning kan afvise. Brug ikke en vellykket Buffer konvertering som bevis på, at en protokols kanoniske repræsentation blev leveret. Hvis den nøjagtige syntaks har betydning for signaturer, cache-nøgler eller interoperabel serialisering, skal du kontrollere det før afkodning.
For en delt regressionstest skal du inkludere ASCII, kinesisk, emoji, en nul byte, byte FF og alle længder omkring en tre-byte grænse. Sammenlign bytes på tværs af kørselstider. Test også URL-sikkert output med en fixtur, der faktisk indeholder de erstattede tegn; et input, hvis output kun er bogstaver, kan ikke bevise, at variantindstillingen virker.
Når du læser filer i Node, skal du beholde den returnerede Buffer i stedet for at anvende en tekstkodning på den læste fil. I browseren, brug File.arrayBuffer(). Disse små grænsevalg undgår mest utilsigtet korruption. Se Node.js Buffer for Node adfærd og MDN: btoa() for browserens byte-streng kontrakt.