Skip to main content

Base64 Kodlama ve Çözme

Base64 kodlayın ve çözün. Türkçe karakterleri (ğ, ü, ş, ı, ö, ç) doğru işler; çıplak btoa kullanımının verdiği hatayı ve bozuk çıktıyı önler.

Veriler tarayıcınızdan çıkmazGüncelleme: Temmuz 2026

Standart alfabe: + ve / karakterlerini kullanır, sonuna = dolgusu ekler.

Özet (TL;DR)

  • btoa('ş') doğrudan InvalidCharacterError fırlatır: btoa yalnızca Latin-1 bilir, dolayısıyla Türkçe içeren her metinde saf yol kırılır.
  • Doğru sıra şudur: TextEncoder ile metni UTF-8 baytlara çevir, baytları Base64'e kodla.
  • Standart alfabe + ve /, URL güvenli alfabe - ve _ kullanır; JWT ve sorgu parametreleri ikincisini ister.
  • Base64 ne şifrelemedir ne de sıkıştırma: veriyi gizlemez ve boyutunu yaklaşık yüzde 33 büyütür.

Türkçe metinlerde btoa neden patlar

Tarayıcıdaki btoa fonksiyonu bir metni değil, aslında bir ikili diziyi bekler: her karakterin kod noktası 0 ile 255 arasında olmak zorundadır. Bu, Latin-1 aralığıdır. Kod noktası 255'i aşan ilk karakterde fonksiyon veri döndürmez, doğrudan istisna fırlatır. Türkçe alfabede ş, ğ, İ ve ı harflerinin hepsi bu sınırın dışındadır, dolayısıyla sıradan bir cümle bile yeterlidir.

javascript
btoa('Kürşad');// Uncaught InvalidCharacterError:// String contains an invalid character // ü Latin-1 içinde olduğu için tek başına geçer, ama yanlış kodlarbtoa('ü');            // 'ãû' baytı değil, tek bayt 0xFC// UTF-8'de 'ü' iki bayttır: 0xC3 0xBC

İkinci satırdaki durum ilkinden daha sinsidir. Karakter Latin-1 aralığına düştüğü için hata alınmaz, ancak üretilen Base64 UTF-8 baytlarını değil tek baytlık Latin-1 kodunu taşır. Çözen taraf UTF-8 beklediğinde ortaya bozuk karakter çıkar ve sorunun kaynağını bulmak zorlaşır, çünkü hiçbir aşamada hata fırlatılmamıştır.

Doğru yol: önce baytlar, sonra Base64

Base64 metinleri değil baytları kodlar. Bu yüzden akış her zaman iki adımlı olmalıdır: metni açık bir şekilde UTF-8 baytlara çevirin, sonra o baytları Base64'e dönüştürün. Çözerken de aynı yolu tersine yürütün. Bu araç tam olarak böyle çalışır, dolayısıyla Türkçe girdilerde ne hata alırsınız ne de bozuk çıktı.

javascript
// Kodlama: metin -> UTF-8 baytlar -> Base64function encode(text) {  const bytes = new TextEncoder().encode(text);  let binary = '';  for (const b of bytes) binary += String.fromCharCode(b);  return btoa(binary);} // Çözme: Base64 -> baytlar -> UTF-8 metinfunction decode(b64) {  const bytes = Uint8Array.from(atob(b64), c => c.charCodeAt(0));  return new TextDecoder('utf-8').decode(bytes);} encode('Kürşad');       // 'S8O8csWfYWQ='decode('S8O8csWfYWQ='); // 'Kürşad'

Bilgi

Çok büyük girdilerde String.fromCharCode çağrısını yayma operatörüyle tek seferde yapmayın. Milyonlarca baytlık bir diziyi tek çağrıda geçirmek "Maximum call stack size exceeded" hatası üretir. Baytları 32 KB'lık parçalar halinde işlemek gerekir.

Alfabeler, dolgu ve satır sonları

Base64'ün iki yaygın alfabesi vardır. Standart varyant (RFC 4648 bölüm 4) 62 ve 63 numaralı karakterler için + ve / kullanır. URL güvenli varyant (bölüm 5) bunların yerine - ve _ koyar ve genellikle sondaki dolgu karakterlerini de atar. Ayrım kozmetik değildir: + bir sorgu parametresinde boşluğa dönüşür, / ise yol ayracı sanılır.

KonuStandartURL güvenli
62. karakter+-
63. karakter/_
Dolgu= ile 4'ün katına tamamlanırGenellikle atılır
Tipik kullanımE-posta ekleri, PEM, data URIJWT, URL yolu, sorgu parametresi, çerez
URL'de güvenli miHayır, yeniden kodlama gerekirEvet
Aynı baytlar iki alfabede farklı metinler üretir; çözerken alfabeyi normalize etmek gerekir.

Dolgu karakteri =, kodlanmış metnin uzunluğunu 4'ün katına tamamlar. Her 3 bayt 4 karaktere dönüştüğü için, kalan 1 bayt iki karakter artı iki dolgu, kalan 2 bayt üç karakter artı bir dolgu üretir. Bu yüzden uzunluğun 4'e bölümünden kalan asla 1 olamaz: hiçbir kodlayıcı tek başına duran bir karakter üretmez. Böyle bir girdi gördüğünüzde metin kopyalanırken kırpılmıştır ve araç bunu ayrı bir mesajla söyler.

Yapıştırılan girdide satır sonları olması da çok yaygındır. PEM biçimindeki sertifikalar ve anahtarlar Base64 gövdesini 64 karakterlik satırlara böler, e-posta ekleri de benzer şekilde sarılır. Bu boşluklar veri değildir, yalnızca biçimlendirmedir; çözmeden önce temizlenmeleri gerekir. Araç girdideki tüm boşluk ve satır sonlarını otomatik olarak atar, dolayısıyla PEM gövdesini olduğu gibi yapıştırabilirsiniz.

Base64 şifreleme değildir

Bu, konuyla ilgili en sık rastlanan yanlış inanıştır ve düzeltmeye değer. Base64 bir kodlamadır, bir şifreleme değildir. Anahtar yoktur, gizli hiçbir bileşen yoktur ve çözme işlemi herkesin elinde olan tamamen genel bir algoritmadır. Bir parolayı ya da API anahtarını Base64'leyip yapılandırma dosyasına koymak onu korumaz, yalnızca gözle okunamaz hale getirir. Aynı şey sıkıştırma için de geçerlidir.

Uyarı

Base64 veriyi küçültmez, aksine büyütür. Her 3 bayt 4 karaktere dönüştüğü için çıktı yaklaşık yüzde 33 daha uzundur (dolgu ve satır sonlarıyla birlikte biraz daha fazla). Görselleri data URI olarak HTML ya da CSS içine gömerken bu maliyet doğrudan sayfa ağırlığına yansır.

Peki Base64 ne işe yarar? Yalnızca metin taşıyabilen kanallardan ikili veri geçirmeye. E-posta gövdeleri, JSON alanları, XML öğeleri, URL parçaları ve HTTP başlıkları bunun tipik örnekleridir. Amacı gizlemek değil, baytların yolda bozulmadan gitmesini sağlamaktır.

İkili veriyi çözerken

Her Base64 metni bir yazıya karşılık gelmez. Bir PNG dosyası, bir protokol tamponu ya da şifreli bir blob çözüldüğünde ortaya geçerli UTF-8 olmayan baytlar çıkar. Bu baytları zorla metin olarak göstermeye çalışmak ekranı U+FFFD değiştirme karakterleriyle doldurur ve hiçbir bilgi vermez. Daha kötüsü, o çıktıyı kopyalayıp geri kodlarsanız orijinal baytları kaybedersiniz, çünkü değiştirme karakteri geri dönüşü olmayan bir kayıptır.

Bu araç çözme sırasında katı UTF-8 modunu kullanır: baytlar geçerli metin değilse sessizce değiştirme yapmak yerine durumu bildirir ve ilk baytların onaltılık görünümünü verir. PNG dosyalarının 89 50 4E 47 ile, JPEG dosyalarının FF D8 FF ile, ZIP arşivlerinin 50 4B 03 04 ile başladığını bilmek, elinizdeki verinin ne olduğunu anlamak için çoğu zaman yeterlidir.

Sıkça Sorulan Sorular

Yapıştırdığım veri bir sunucuya gidiyor mu?
Hayır. Kodlama ve çözme tamamen tarayıcınızda çalışan JavaScript ile yapılır, girdi hiçbir ağ isteğine konu olmaz. Sayfa yüklendikten sonra bağlantınızı kesseniz bile araç çalışır.
Türkçe karakterli metni kodladım, başka bir araçta farklı çıktı verdi. Hangisi doğru?
Büyük ihtimalle diğer araç metni UTF-8 yerine Latin-1 olarak yorumluyor. UTF-8'de ş harfi iki bayttır, Latin-1'de ise hiç yoktur. Kaynağı UTF-8 kabul eden çıktı doğrudur; bu araç her zaman TextEncoder ile UTF-8 kullanır.
Standart alfabe mi URL güvenli alfabe mi kullanmalıyım?
Değer bir URL yolunda, sorgu parametresinde, çerezde ya da JWT segmentinde taşınacaksa URL güvenli alfabeyi seçin. Diğer tüm durumlarda standart alfabe uygundur. Çözerken fark önemsizdir, çünkü bu araç iki alfabeyi de kabul eder.
Sondaki eşittir işaretlerini silebilir miyim?
Çoğu çözücü dolgusuz girdiyi kabul eder ve bu araç da eksik dolguyu kendisi tamamlar. Ancak katı davranan uygulamalar vardır, bu yüzden veriyi başka bir sisteme gönderiyorsanız dolguyu koruyun. JWT gibi dolgusuz olması beklenen bağlamlar bunun istisnasıdır.
Base64 ile parolamı gizleyebilir miyim?
Hayır. Base64 herkesin çözebileceği açık bir kodlamadır, anahtar içermez ve hiçbir güvenlik değeri yoktur. Parolalar için karma algoritmaları (bcrypt, Argon2), gizli değerler için ise gerçek şifreleme ya da bir secret yöneticisi kullanılmalıdır.

Mustafa Kürşad BAŞER

Yazılım Mühendisi

Karmaşık sorunları zarif çözümlerle buluşturan, öğrendiklerini paylaşarak değer katmayı seven bir yazılım mühendisi.

Hızlı Erişim

Bağlantı

© 2026 Mustafa Kürşad BAŞER. Tüm hakları saklıdır.