En nettleserklient og en Node.js-tjeneste skal produsere samme Base64 for de samme bytene. De trenger ikke å bruke den samme API for å gjøre det. Den viktige avtalen er byte-representasjonen av tekst, alfabetet og behandlingen av utfylling og ugyldig inndata.
Nettleser: gjør trinnet UTF-8 eksplisitt
De tradisjonelle nettleserfunksjonene opererer på byte-strenger. Konverter Unicode-tekst med TextEncoder, koder deretter disse bytene. På returbanen, rekonstruer en byte-array og dekode UTF-8 eksplisitt. Dette eksemplet bruker en sløyfe for å unngå å utvide en stor matrise til funksjonsargumenter, selv om en produksjonsfilkoder fortsatt bør bruke avgrensede biter 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 bytegrensen
Buffer.from(text, 'utf8') gjør tekstkodingen synlig. Ringer toString('base64') representerer deretter disse bytene. Dekoding til en Buffer bevarer binære data; å konvertere umiddelbart til en UTF-8-streng er bare passende når nyttelasten er kjent for å 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 bevisst. Vanlig Buffer UTF-8 strengkonvertering kan sette inn erstatningstegn for ugyldig inndata. En vellykket tekstvisning ville da skjule at de originale bytene ikke kunne representeres trofast.
Avtal validering separat
Nodes Base64-dekoder godtar noen inndataskjemaer som en strengere søknad kan avvise. Ikke bruk en vellykket Buffer konvertering som bevis på at en protokolls kanoniske representasjon ble levert. Hvis eksakt syntaks er viktig for signaturer, hurtigbuffernøkler eller interoperabel serialisering, sjekk det før dekoding.
For en delt regresjonstest, inkluderer ASCII, kinesisk, emoji, en null byte, byte FF og alle lengder rundt en tre-byte grense. Sammenlign byte på tvers av kjøretider. Test også URL-sikker utgang med en fikstur som faktisk inneholder de erstattede tegnene; en inngang hvis utgang kun er bokstaver kan ikke bevise at variantalternativet fungerer.
Når du leser filer i Node, behold den returnerte Buffer i stedet for å bruke en tekstkoding på filen som er lest. I nettleseren, bruk File.arrayBuffer(). Disse små grensevalgene unngår mest utilsiktet korrupsjon. Se Node.js Buffer for Node oppførsel og MDN: btoa() for nettleserens bytestrengkontrakt.