Mojibake Nedir?
Mojibake, bir metnin farklı karakter kodlamaları (encoding) arasında yanlış yorumlanması sonucu ortaya çıkan karakter bozulmasıdır.
Örnek:
| Doğru | Bozuk (Mojibake) |
|---|---|
| İstanbul | İstanbul |
| Çalışma | Çalışma |
| Şifre | Åžifre |
Bu durum özellikle Türkçe gibi ASCII dışı karakterler (ç, ğ, ı, İ, ö, ş, ü) kullanan dillerde çok sık görülür.
Temel Sebep: Encoding Uyumsuzluğu
Bilgisayarlar karakterleri doğrudan saklamaz; byte dizileri olarak tutar. Bu byte’ların nasıl yorumlanacağı encoding tarafından belirlenir.
En yaygın encoding türleri:
- UTF-8 (modern standart)
- ISO-8859-9 (Latin-5 — eski Türkçe encoding)
- Windows-1254 (eski Windows Türkçe)
- UTF-16
Sorun şu olduğunda oluşur:
Metin UTF-8 olarak kaydedilir ama Latin-5 gibi okunursa → Mojibake oluşur.
En Yaygın Türkçe Mojibake Senaryosu
Senaryo
- Metin UTF-8 olarak kaydedildi
- Sistem bunu ISO-8859-9 olarak okudu
Örnek:
Ş → UTF-8 byte: C5 9E
Bu byte’lar yanlış encoding ile okunursa:
Åž
sonucu oluşur.
Mojibake Nasıl Oluşur? (Teknik Akış)
Doğru metin
↓
UTF-8 encode
↓
Byte stream
↓ (yanlış decode)
Latin-1 / Windows-1254
↓
Bozuk karakterler
Buradaki kritik hata:
Encode ve Decode işlemleri aynı encoding ile yapılmıyor.
Yazılım Geliştirmede En Sık Görülen Sebepler
1 - Database Encoding Problemleri
Özellikle MySQL'de klasik hata:
- Database UTF-8
- Connection Latin1
Kontrol:
SHOW VARIABLES LIKE 'character_set%';
Doğru olması gereken:
utf8mb4
2 - HTTP Header Eksikliği
Backend charset belirtmezse browser tahmin eder.
Yanlış:
Content-Type: text/html
Doğru:
Content-Type: text/html; charset=utf-8
3 - JSON Encoding Sorunları
Bazı eski sistemler JSON’u UTF-8 dışında gönderir.
Doğru:
res.setHeader("Content-Type", "application/json; charset=utf-8");
4 - Dosya Encoding Hataları
IDE kaynaklı problemler:
- Notepad ANSI kaydetme
- VS Code encoding yanlış
Kontrol:
UTF-8 (without BOM)
5 - Double Encoding (İleri Seviye Hata)
En tehlikeli senaryo:
UTF-8 → yanlış decode → tekrar encode
Sonuç:
İstanbul
Bu artık zincirleme mojibake’dir.
Mojibake Teşhisi (Debug Yöntemleri)
1 - Byte Seviyesi Kontrol
Node.js:
Buffer.from("Ş", "utf8")
Python:
"Ş".encode("utf-8")
2 - Encoding Testi
Bozuk metni geri çevirmek bazen mümkündür:
broken.encode("latin1").decode("utf8")
3 - Browser DevTools
Network → Response Headers:
charset=utf-8
kontrol edilmelidir.
Backend Tarafında Kalıcı Çözümler
Node.js / Express
app.use((req, res, next) => {
res.setHeader("Content-Type", "text/html; charset=utf-8");
next();
});
MySQL (Önerilen Ayar)
ALTER DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Connection:
charset: "utf8mb4"
PHP
header('Content-Type: text/html; charset=utf-8');
Frontend Tarafında Çözüm
HTML içinde mutlaka:
<meta charset="UTF-8">
Bu satır <head> içinde ilk satırlardan biri olmalıdır.
Gerçek Hayat Örnekleri
API → Frontend
API UTF-8 gönderir, frontend Latin-1 varsayar.
Sonuç:
ücretsiz
CSV Export
Excel özellikle Windows’ta UTF-8 CSV’yi yanlış açabilir.
Çözüm:
- UTF-8 BOM eklemek
- veya XLSX export kullanmak
Mojibake Önleme Checklist
✔ Her yerde UTF-8 kullan
✔ DB charset = utf8mb4
✔ HTTP charset belirt
✔ IDE encoding kontrol et
✔ JSON UTF-8 gönder
✔ Dosya import/export encoding kontrol et
Senior-Level Tavsiye
Modern projelerde şu prensip kullanılmalı:
Encoding is a system-wide contract.
Yani:
- Backend
- Database
- API
- Frontend
- Log sistemi
- Queue sistemi
hepsi aynı encoding standardında olmalıdır.
Sonuç
Türkçe karakterlerde mojibake:
- Bir bug değil,
- Bir encoding sözleşmesi ihlalidir.
Sorunun kaynağı genelde:
UTF-8 dışındaki herhangi bir noktadır.
Doğru mimari:
UTF-8 everywhere