Aramaya başladığınızda Base64 her yerde karşınıza çıkar — JWT token'ları, veri URI'leri,
e-posta ekleri, ikili dosyalar taşıyan API payload'ları. Kodlamanın kendisi
RFC 4648'de
tanımlanmıştır ve kavramsal olarak son derece basittir: rastgele baytları alın, yalnızca 64 yazdırılabilir
ASCII karakteri kullanarak temsil edin. İnsanları zorlayan şey JavaScript'teki uygulamadır —
tarayıcı ile Node.js'deki farklı API'ler, btoa()'nın hata fırlatmasına neden olan Unicode
tuzağı ve JWT'lerin dayandığı URL güvenli varyant. Bu rehber, çalışan kodla bunların hepsini kapsar.
Tarayıcıda btoa() ve atob()
Tarayıcı uzun süredir
btoa()
ve
atob()'ya
sahiptir. İsimler kafa karıştırıcıdır (binary to ASCII ve tersi), ancak basit dizeler için
kullanımı kolaydır:
// Encode a plain ASCII string
const encoded = btoa('hello world');
console.log(encoded); // "aGVsbG8gd29ybGQ="
// Decode it back
const decoded = atob('aGVsbG8gd29ybGQ=');
console.log(decoded); // "hello world"
// A more realistic example — encoding a simple auth token
const credentials = 'apiuser:s3cr3tkey';
const basicAuth = 'Basic ' + btoa(credentials);
// "Basic YXBpdXNlcjpzM2NyM3RrZXk="
// This is exactly what HTTP Basic Authentication usesbtoa() yalnızca her karakterin kod noktasının
≤ 255 olduğu dizeleri işler (Latin-1 aralığı). Emoji veya Latin dışı herhangi bir karakter içeren
bir dize geçirirseniz hemen InvalidCharacterError fırlatır.
Bu, tarayıcı kodundaki en yaygın Base64 hatalarından biridir.// ❌ This throws — emoji is outside Latin-1
btoa('Hello 🌍');
// Uncaught DOMException: Failed to execute 'btoa' on 'Window':
// The string to be encoded contains characters outside of the Latin1 range.
// ❌ This also throws — any non-ASCII character will do it
btoa('café');
// Uncaught DOMException: ...Tarayıcıda Unicode'u Güvenli Şekilde İşleme
Çözüm, önce dizeyi UTF-8 baytlarına kodlamak, ardından bu baytları Base64 ile kodlamaktır.
Klasik yaklaşım encodeURIComponent ve yüzde çözme hilesi kullanır. Modern yaklaşım,
tüm modern tarayıcılarda
ve Node.js 11+'da mevcut olan TextEncoder'ı kullanır:
// ✅ Unicode-safe encode using TextEncoder
function encodeBase64(str) {
const bytes = new TextEncoder().encode(str); // UTF-8 byte array
const binString = Array.from(bytes, byte =>
String.fromCodePoint(byte)
).join('');
return btoa(binString);
}
// ✅ Unicode-safe decode using TextDecoder
function decodeBase64(base64Str) {
const binString = atob(base64Str);
const bytes = Uint8Array.from(binString, char =>
char.codePointAt(0)
);
return new TextDecoder().decode(bytes);
}
// Now emojis and international text work fine
console.log(encodeBase64('Hello 🌍')); // "SGVsbG8g8J+MjQ=="
console.log(decodeBase64('SGVsbG8g8J+MjQ==')); // "Hello 🌍"
console.log(encodeBase64('Héllo café')); // "SMOpbGxvIGNhZsOp"
console.log(decodeBase64('SMOpbGxvIGNhZsOp')); // "Héllo café"Bu iki yardımcı fonksiyonu kod tabanınızda bir yere koyun ve çıplak btoa()'nın
var olduğunu unutun. TextEncoder/TextDecoder çifti, saf ASCII'nin ötesindeki
her şey için doğru araçtır.
Base64 Encoder aracıyla hemen deneyebilirsiniz.
Node.js'de Buffer.from()
Node.js'de bunun için Buffer sınıfı aracılığıyla kendi API'si vardır ve kodlama/kod çözmeyi daha temiz şekilde işler. Giriş kodlamasını açıkça belirttiğiniz için burada Unicode tuzağı yoktur:
// Encode string → Base64
const encoded = Buffer.from('Hello 🌍', 'utf8').toString('base64');
console.log(encoded); // "SGVsbG8g8J+MjQ=="
// Decode Base64 → string
const decoded = Buffer.from('SGVsbG8g8J+MjQ==', 'base64').toString('utf8');
console.log(decoded); // "Hello 🌍"
// Practical example — encoding a JSON payload to embed in a config file
const config = {
apiKey: 'sk-prod-abc123',
projectId: 'proj_x9f2k',
region: 'us-east-1'
};
const encodedConfig = Buffer.from(JSON.stringify(config), 'utf8').toString('base64');
// eyJhcGlLZXkiOiJzay1wcm9kLWFiYzEyMyIsInByb2plY3RJZCI6InByb2pfeDlmMmsiLCJyZWdpb24iOiJ1cy1lYXN0LTEifQ==
// Decode and parse it back
const decodedConfig = JSON.parse(
Buffer.from(encodedConfig, 'base64').toString('utf8')
);
console.log(decodedConfig.region); // "us-east-1"btoa() ve atob()'nun tarayıcı uyumluluğu için Node.js 16+'da da
global olarak mevcut olduğunu unutmayın, ancak Buffer API'si Node.js'de daha deyimseldir
ve
Node.js v0.1'den
beri mevcuttur. JSON'a özgü kodlama için JSON'dan Base64'e aracı hızlı
manuel dönüşümler için kullanışlıdır.
URL Güvenli Base64 — JWT'lerin Gerçekte Kullandığı Şey
Standart Base64, alfabesinde + ve / kullanır. Bu karakterlerin
ikisi de URL'lerde özeldir — +, sorgu dizelerinde boşluk anlamına gelir ve /
bir yol ayırıcısıdır. Bir URL'de veya JWT segmenti olarak Base64'e ihtiyaç duyduğunuzda URL güvenli
varyantı kullanırsınız: +'yı - ile, /'yı _ ile
değiştirin ve = dolgusunu kaldırın.
RFC 4648 §5'te
standartlaştırılmıştır ve her JWT kütüphanesinin dahili olarak kullandığı şeydir:
// Convert standard Base64 to URL-safe Base64
function toBase64Url(base64Str) {
return base64Str
.replace(/+/g, '-')
.replace(///g, '_')
.replace(/=+$/, ''); // strip padding
}
// Convert URL-safe Base64 back to standard Base64
function fromBase64Url(base64UrlStr) {
// Restore padding — length must be a multiple of 4
const padded = base64UrlStr + '==='.slice((base64UrlStr.length + 3) % 4);
return padded
.replace(/-/g, '+')
.replace(/_/g, '/');
}
// Encode a string to URL-safe Base64
function encodeBase64Url(str) {
return toBase64Url(btoa(str));
}
// Decode URL-safe Base64 to a string
function decodeBase64Url(str) {
return atob(fromBase64Url(str));
}
// Example: manually inspect a JWT payload
const jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjQyLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE3MTM0MDAwMDB9.signature';
const [header, payload] = jwt.split('.');
console.log(decodeBase64Url(header));
// {"alg":"HS256","typ":"JWT"}
console.log(decodeBase64Url(payload));
// {"userId":42,"role":"admin","iat":1713400000}JWT'lerde eyJhbGciOiJIUzI1NiJ9 gibi Base64 dizelerini görmemenizin nedeni budur —
dolgu yok, artı işaretleri yerine kısa çizgiler. Kodlanmış veriyi URL sorgu parametresi olarak gönderirken,
bozuk URL'lerden kaçınmak için her zaman URL güvenli varyantı kullanın.
Base64 Decoder aracı, hem standart hem de URL güvenli Base64'ü
otomatik olarak işler.
FileReader API ile Dosya Kodlama
Yaygın bir tarayıcı görevi: kullanıcı bir resim veya belge seçer ve bunu Base64 olarak bir
API'ye göndermeniz gerekir.
FileReader API'sinin
tam olarak bunun için readAsDataURL() metodu vardır — MIME türü dahil eksiksiz bir veri
URI'si verir:
// Wrap FileReader in a Promise for easier async usage
function fileToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
// result is "data:image/png;base64,iVBORw0KGgo..."
// Strip the data URI prefix to get just the Base64 string
const base64 = reader.result.split(',')[1];
resolve(base64);
};
reader.onerror = () => reject(new Error('Failed to read file'));
reader.readAsDataURL(file);
});
}
// Hook it up to a file input
const fileInput = document.getElementById('avatarUpload');
fileInput.addEventListener('change', async (event) => {
const file = event.target.files[0];
if (!file) return;
try {
const base64 = await fileToBase64(file);
console.log(`File size: ${file.size} bytes`);
console.log(`Base64 length: ${base64.length} chars`);
// Send to your API
await fetch('/api/users/42/avatar', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ image: base64, mimeType: file.type })
});
} catch (err) {
console.error('Upload failed:', err.message);
}
});Yalnızca ham Base64 yerine tam veri URI'sine (MIME türü öneki dahil) ihtiyacınız varsa,
.split(',')[1]'i atlayın ve reader.result'u doğrudan kullanın.
Toplu dosya dönüştürme için Resimden Base64'e aracı,
herhangi bir kod yazmadan resimleri işler.
İkili Veri ve Uint8Array Kodlama
Bazen bir dize veya Dosya'dan başlamıyorsunuzdur — WebCrypto işleminden, canvas dışa aktarımından
veya WebAssembly modülünden ham baytlarınız var. Her iki ortamda da Uint8Array'den Base64'e
ve geri gitme yöntemi:
// --- Browser ---
// Uint8Array → Base64 (browser)
function uint8ToBase64(bytes) {
const binString = Array.from(bytes, byte =>
String.fromCodePoint(byte)
).join('');
return btoa(binString);
}
// Base64 → Uint8Array (browser)
function base64ToUint8(base64Str) {
const binString = atob(base64Str);
return Uint8Array.from(binString, char => char.codePointAt(0));
}
// Example: export a canvas as raw PNG bytes → Base64
const canvas = document.getElementById('myCanvas');
canvas.toBlob(blob => {
blob.arrayBuffer().then(buffer => {
const bytes = new Uint8Array(buffer);
const encoded = uint8ToBase64(bytes);
console.log('PNG as Base64:', encoded.slice(0, 40) + '...');
});
}, 'image/png');
// --- Node.js ---
// Uint8Array / Buffer → Base64 (Node.js)
function uint8ToBase64Node(bytes) {
return Buffer.from(bytes).toString('base64');
}
// Base64 → Buffer (Node.js)
function base64ToBufferNode(base64Str) {
return Buffer.from(base64Str, 'base64');
}
// Example: hash a password and encode the result
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('mySecretPassword').digest();
// hash is a Buffer (which extends Uint8Array)
console.log(hash.toString('base64'));
// "XohImNooBHFR0OVvjcYpJ3NgxxxxxxxxxxxxxA=="Veri URI'leri Olarak Resim Gömme
Web geliştirmede Base64'ün en pratik kullanımlarından biri, resimleri doğrudan HTML veya CSS'e gömerek bir HTTP isteğini ortadan kaldırmaktır. Veri URI'lerini muhtemelen satır içi SVG'lerde veya e-posta şablonlarında görmüşsünüzdür. İşte pattern:
<!-- Inline image in HTML — no separate network request -->
<img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
alt="1x1 transparent pixel"
width="1"
height="1"
/>/* Inline background image in CSS — commonly used for small icons and loading spinners */
.spinner {
width: 32px;
height: 32px;
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDJhMTAgMTAgMCAxIDAgMCAyMCAxMCAxMCAwIDAgMCAwLTIweiIvPjwvc3ZnPg==");
background-repeat: no-repeat;
background-position: center;
background-size: contain;
}// Generate a data URI from a fetched image (Node.js)
const fs = require('fs');
const path = require('path');
function imageFileToDataUri(filePath) {
const ext = path.extname(filePath).slice(1).toLowerCase();
const mimeMap = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg',
gif: 'image/gif', svg: 'image/svg+xml', webp: 'image/webp' };
const mimeType = mimeMap[ext] ?? 'application/octet-stream';
const fileData = fs.readFileSync(filePath);
const base64 = fileData.toString('base64');
return `data:${mimeType};base64,${base64}`;
}
const dataUri = imageFileToDataUri('./logo.png');
// "data:image/png;base64,iVBORw0KGgo..."
// Drop this into an <img src> or CSS background-imageHer İki Ortam için Kompakt Bir Yardımcı Modül
Kod tabanınıza btoa() çağrıları dağıtmak yerine, Unicode'u, URL güvenli varyantları
kapsayan ve hem tarayıcıda hem de Node.js'de çalışan tek bir yardımcı modüle sahip olmak değerlidir.
İşte bunların hepsini yapan bir modül:
// base64.js — drop into any project
const isNode = typeof process !== 'undefined' && process.versions?.node;
export function encode(str) {
if (isNode) {
return Buffer.from(str, 'utf8').toString('base64');
}
// Browser: encode to UTF-8 bytes first, then Base64
const bytes = new TextEncoder().encode(str);
const binString = Array.from(bytes, b => String.fromCodePoint(b)).join('');
return btoa(binString);
}
export function decode(base64Str) {
if (isNode) {
return Buffer.from(base64Str, 'base64').toString('utf8');
}
// Browser: Base64 → bytes → UTF-8 string
const binString = atob(base64Str);
const bytes = Uint8Array.from(binString, c => c.codePointAt(0));
return new TextDecoder().decode(bytes);
}
export function encodeUrlSafe(str) {
return encode(str)
.replace(/+/g, '-')
.replace(///g, '_')
.replace(/=+$/, '');
}
export function decodeUrlSafe(str) {
const padded = str + '==='.slice((str.length + 3) % 4);
return decode(padded.replace(/-/g, '+').replace(/_/g, '/'));
}
export function encodeBytes(bytes) {
if (isNode) return Buffer.from(bytes).toString('base64');
const binString = Array.from(bytes, b => String.fromCodePoint(b)).join('');
return btoa(binString);
}
export function decodeToBytes(base64Str) {
if (isNode) return Buffer.from(base64Str, 'base64');
const binString = atob(base64Str);
return Uint8Array.from(binString, c => c.codePointAt(0));
}// Usage examples
import { encode, decode, encodeUrlSafe, decodeUrlSafe } from './base64.js';
encode('Hello 🌍'); // "SGVsbG8g8J+MjQ=="
decode('SGVsbG8g8J+MjQ=='); // "Hello 🌍"
encodeUrlSafe('[email protected]'); // "dXNlckBleGFtcGxlLmNvbQ" (no +, /, or =)
decodeUrlSafe('dXNlckBleGFtcGxlLmNvbQ'); // "[email protected]"Dikkat Edilmesi Gereken Yaygın Tuzaklar
- btoa(), Latin dışı karakterlerde hata fırlatır — 255 kod noktasının üzerindeki herhangi bir karakter
InvalidCharacterError'a neden olur. Her zamanTextEncoderyaklaşımını veya Node.js'deBuffer.from(str, 'utf8')'i kullanın. - Dolgu, kod çözme için önemlidir — Base64 dizelerinin 4'ün katı olan bir uzunluğu olmalıdır. Eksik
=dolgusu,atob()'nun tarayıcıya bağlı olarak sessizce çöp döndürmesine veya hata fırlatmasına neden olur. URL güvenli dizeleri çözmeden önce her zaman dolguyu geri yükleyin. - Node.js'de Buffer vs dize kodlaması —
Buffer.from(str)varsayılan olarak UTF-8'dir, ancakBuffer.from(str, 'binary')dizeyi Latin-1 baytları olarak işler. Kod çözerken yanlış kodlama kullanmak, hata ayıklaması zor olabilen bozuk çıktı üretir. - Veri URI MIME türü —
data:;base64,...(MIME türü yok) bazı tarayıcılarda çalışır ama diğerlerinde çalışmaz. Her zaman MIME türünü ekleyin:data:image/png;base64,.... - MIME Base64'te satır sonları — RFC 4648, uygulamaların her 76 karakterde bir satır sonu eklemesine izin verir (e-posta kodlayıcıların yaptığı gibi).
atob()veBuffer.from()her ikisini de işler, ancak Base64'ü kendiniz üretiyorsanız, hedef sistem bunları beklemiyorsa satır sonu eklemeyin.
Özet
JavaScript'teki Base64, sizi ısırıncaya kadar önemsiz görünen konulardan biridir.
Kısa versiyonu: kullanıcı tarafından oluşturulan herhangi bir şey için çıplak btoa()
asla kullanmayın — Unicode'u doğru şekilde işlemek için TextEncoder ile sarın.
Node.js'de Buffer.from(str, 'utf8').toString('base64') doğru deyimdir.
Kodlanmış dize bir URL veya JWT'de yer alacaksa URL güvenli varyanta geçin.
Hızlı deneyler veya tek seferlik dönüşümler için
Base64 Encoder, Base64 Decoder
ve JSON'dan Base64'e araçları zaman kazandırır.
MDN Base64 sözlük sayfası
da bu konulardan herhangi biri hakkında ikinci bir görüşe ihtiyacınız varsa sağlam bir tarayıcı odaklı
referansa sahiptir.