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

  1. Metin UTF-8 olarak kaydedildi
  2. 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