İsimler atob ve btoa sıradan metin dönüştürmeyi önerebilir. Tarayıcı sözleşmeleri daha dardır: Base64 metni ile karakter değerleri tek tek baytları temsil eden bir dize arasında dönüştürme yaparlar. Bu bayt dizesi bir kapsayıcıdır, sonucun okunabilir Unicode metin olacağına dair bir söz değildir.
İki farklı dize
JavaScript dizeleri UTF-16 kod birimlerini kullanır. Bir bayt dizesi, her karakter değerini kasıtlı olarak 0-255 arasında sınırlar. btoa('Hello') ASCII değerleri bu aralığa uyduğu için çalışır. btoa('你好') başarısız olur çünkü bu karakterler bir bayta sığmaz. Uygun bir karakter bile yanıltıcı olabilir: btoa('é') birçok hizmetin beklediği UTF-8 bayt C3 A9'u değil, tek bayt E9'u kodlar.
console.log(btoa('é')); // 6Q== (byte E9)
console.log(btoa(String.fromCharCode(0xc3, 0xa9))); // w6k= (UTF-8)
Bayt işlevlerinin çevresine UTF-8 dönüşümünü yerleştirin
TextEncoder metinden UTF-8 bayt üretir. Base64 kodunun çözülmesinden sonra ölümcül TextDecoder geçerli UTF-8 baytlarını tekrar metne dönüştürür ve geçersiz dizileri sessizce değiştirmek yerine reddeder. Bu küçük örnek, sınırın görünür olması için kasıtlı olarak açık bir şekilde verilmiştir.
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); // 中文😊
İkili sonucu bozuk bir dize olarak değerlendirmeyin
atob('/w==') FF baytını temsil eder. Tek başına UTF-8 geçerli değildir, ancak tamamen geçerli bir ikili veridir. Bir sonraki doğru eylem, farklı bir metin dönüştürme numarası değil, bayt indirme veya onaltılık görünüm olabilir. Bu bayt dizesini çalıştırma TextEncoder U+00FF karakterini kodlar ve baytları değiştirir.
Tarayıcı kod çözücüsü aynı zamanda tam bir protokol doğrulayıcı değildir. Kabul edilen boşluklar ve atlanan dolgular, katı uygulama gereksinimlerinden farklı olabilir. Bir protokol kanonik kodlama gerektiriyorsa alfabeyi, dolguyu ve kullanılmayan bitleri ayrı ayrı doğrulayın. Büyük dosyalar için, tam bayt dizisini String.fromCharCode(...bytes); bağımsız değişken sayısı sınırları, dosya alışılmadık derecede büyük hale gelmeden çok önce başarısız olabilir.
Tarayıcı sözleşmelerini okuyun MDN: atob() ve MDN: btoa(). Uygulama, bunların aynı görev olduğunu varsaymak yerine izin verici bir dönüşüm, katı bir doğrulayıcı veya dosya koruyucu bir iş akışı isteyip istemediğine karar vermelidir.