Bir tarayıcı istemcisi ve bir Node.js hizmeti, aynı baytlar için aynı Base64 değerini üretmelidir. Bunu yapmak için aynı API'yi kullanmaları gerekmez. Önemli anlaşma, metnin bayt temsili, alfabe ve dolgu ve geçersiz girişin ele alınmasıdır.
Tarayıcı: UTF-8 adımını açık hale getirin
Geleneksel tarayıcı işlevleri bayt dizeleri üzerinde çalışır. Unicode metnini şununla dönüştür: TextEncoder, ardından bu baytları kodlayın. Dönüş yolunda bir bayt dizisini yeniden oluşturun ve UTF-8 kodunu açıkça çözün. Bu örnek, büyük bir diziyi işlev bağımsız değişkenlerine genişletmekten kaçınmak için bir döngü kullanır, ancak bir üretim dosyası kodlayıcısının yine de sınırlı parçaları veya uygun bir bayt API kullanması gerekir.
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: Buffer'yi bayt sınırında tutun
Buffer.from(text, 'utf8') metin kodlamasını görünür hale getirir. Arama toString('base64') daha sonra bu baytları temsil eder. Buffer kodunun çözülmesi ikili verileri korur; hemen bir UTF-8 dizesine dönüştürmek yalnızca yükün metin olduğu bilindiğinde uygundur.
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)); // 中文😊
Örnekteki ölümcül TextDecoder kasıtlıdır. Sıradan Buffer UTF-8 dize dönüştürme, geçersiz giriş için değiştirme karakterleri ekleyebilir. Başarılı bir metin gösterimi, orijinal baytların aslına sadık kalarak temsil edilemediğini gizleyecektir.
Doğrulama konusunda ayrı ayrı anlaşın
Düğümün Base64 kod çözücüsü, daha katı bir uygulamanın reddedebileceği bazı giriş formlarını kabul eder. Başarılı bir Buffer dönüşümünü, protokolün kanonik gösteriminin sağlandığının kanıtı olarak kullanmayın. İmzalar, önbellek anahtarları veya birlikte çalışabilir serileştirme için tam söz dizimi önemliyse, kod çözmeden önce bunu kontrol edin.
Paylaşılan bir regresyon testi için ASCII, Çince, emoji, sıfır bayt, FF baytı ve üç baytlık sınır çevresindeki tüm uzunlukları ekleyin. Baytları çalışma zamanları arasında karşılaştırın. Ayrıca URL-güvenli çıktıyı, değiştirilen karakterleri gerçekten içeren bir donanımla test edin; çıktısı yalnızca harflerden oluşan bir girdi, değişken seçeneğinin çalıştığını kanıtlayamaz.
Düğümde dosyaları okurken, okunan dosyaya bir metin kodlaması uygulamak yerine döndürülen Buffer değerini koruyun. Tarayıcıda şunu kullanın: File.arrayBuffer(). Bu küçük sınır seçimleri çoğu kazara yolsuzluğu önler. Bkz. Node.js Buffer Düğüm davranışı için ve MDN: btoa() tarayıcı bayt dizisi sözleşmesi için.