Türkçe karakterler neden ü ve ÅŸ oluyor?
Mojibake, UTF-8 ile kodlanmış bir metnin başka bir kodlamaymış gibi — genellikle Windows-1252 ya da Windows-1254 — okunmasıyla ortaya çıkar. UTF-8, "ü" harfini iki bayt olarak saklar: 0xC3 0xBC. Bu iki bayt teker teker Windows-1252 sanılarak okununca à ve ¼ karakterlerine dönüşür, yani tek bir harf ikiye çıkar. Şapkalı ya da noktalı her Türkçe harf aynı şekilde bozulur: ç → ç, ş → ÅŸ, ğ → ÄŸ.
Bozulma neredeyse her zaman bir sınırda olur: karakter kümesi yanlış tanımlanmış bir veritabanı kolonu, charset=utf-8 taşımayan bir HTTP cevabı, Excel dışa aktarımı ya da UTF-8 öncesinden kalma bir istemci. Baytlar hâlâ orada durduğu — sadece yanlış yorumlandığı — için metin genellikle birebir geri getirilebilir: yanlış kod sayfasıyla tekrar bayta çevirip o baytları UTF-8 olarak çözmek yeterli.
Bu araç bunu yapıyor ve zor olan ikinci durumu da kaldırıyor: iki kez bozulmuş, doğru karakterin yanına artık bir öncü baytın yapıştığı metinler (Türkçe yerine Tüürkçe gibi). Girdiyi yerinde onarıyor ve kaç tur gerektiğini bildiriyor, böylece tek katlı bozulmayla tekrarlananı ayırt edebiliyorsunuz.
Bilgi kaybı oluyor mu?
- Genellikle hayır. Baytlar bozulmadan duruyor, sadece yanlış okunuyor; onarım birebir. Kayıp yalnızca yanlış kod sayfasında o bayta karşılık gelen bir karakter olmadığında ve yerine soru işareti ya da U+FFFD konduğunda olur — o noktada orijinal gitmiştir, hiçbir araç geri getiremez.
Tekrar olmasını nasıl engellerim?
- Veriyi değil sınırı düzeltin. Cevaplarda charset=utf-8 bildirin, Oracle tarafında NVARCHAR2 ya da AL32UTF8 veritabanı karakter kümesi kullanın, ve istemci kodlamasını işletim sistemi varsayılanına bırakmayın — Türkçe bir Windows kurulumunda o varsayılan UTF-8 değil, Windows-1254.