"ı" ya da "ÅŸ" gibi garip işaretlerle dolu bir e-posta, Excel'de açınca bozulan bir CSV dosyası veya veritabanında soru işaretine dönüşmüş isimler... Türkçe ile çalışan herkes bu sorunlarla karşılaşmıştır. Hepsinin kökü aynıdır: karakter kodlama uyuşmazlığı.
Bilgisayar harfleri nasıl saklar?
Bilgisayar yalnızca sayıları saklar. Karakter kodlaması, her harfin hangi sayıyla temsil edileceğini belirleyen tablodur. Eski sistemlerde her dil için ayrı tablolar vardı; Türkçe için en yaygını Windows-1254 ve ISO-8859-9 idi. Aynı sayı farklı tablolarda farklı harfe karşılık geldiğinden, bir dosya yanlış tabloyla okunduğunda harfler bozulur.
Unicode ve UTF-8
Unicode, dünyadaki tüm yazı sistemlerini tek bir tabloda toplar. UTF-8 ise Unicode karakterlerini saklamanın en yaygın yoludur:
- İngilizce harfler 1 bayt, Türkçe harfler 2 bayt, emojiler 4 bayt yer kaplar.
- Web sayfalarının çok büyük bölümü UTF-8 kullanır.
- Yeni her proje, dosya ve veritabanı için varsayılan tercih UTF-8 olmalıdır.
"ı" görüntüsü, UTF-8 ile kaydedilmiş "ı" harfinin eski bir tabloyla okunmasının tipik sonucudur.
Sık görülen sorunlar ve çözümleri
CSV dosyası Excel'de bozuk açılıyor
Excel, UTF-8 CSV dosyasını tanıyabilmek için dosyanın başında BOM adı verilen küçük bir işaret bekler. Yazılımınız CSV üretirken "UTF-8 with BOM" kullanırsa sorun çözülür. Daha kalıcı çözüm doğrudan .xlsx üretmektir; bkz. Excel rapor otomasyonu.
Veritabanında soru işaretleri
SQL Server'da Türkçe metinler için nvarchar gibi Unicode alan türleri kullanılmalıdır. Uygun olmayan bir alan türü veya yanlış "collation" ayarı karakter kaybına yol açar.
Web sayfasında bozuk karakterler
HTML'in en başında <meta charset="UTF-8"> bulunmalı, dosyanın kendisi de gerçekten UTF-8 olarak kaydedilmelidir.
Yazılımcılar için: Türkçe "İ" tuzağı
Türkçede i harfinin büyüğü İ, ı harfinin büyüğü I'dır. Bu kural İngilizceden farklıdır ve klasik bir hataya yol açar:
// tr-TR kültüründe çalışan bir sunucuda:
"file".ToUpper(); // "FİLE" olur, "FILE" değil
"FILE".ToLower() == "file"; // false döner
// Doğrusu: kültürden bağımsız karşılaştırma
string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
"file".ToUpperInvariant(); // "FILE"
Kullanıcıya gösterilen metinlerde Türkçe kültür kurallarını, dosya adları, komutlar ve anahtarlar gibi teknik karşılaştırmalarda ise kültürden bağımsız (invariant/ordinal) karşılaştırmaları kullanmak gerekir.
Sık sorulan sorular
Bozulmuş bir metni geri kurtarabilir miyim?
Çoğu zaman evet. Metni hangi kodlamayla yanlış okunduğu biliniyorsa ters işlemle düzeltilebilir. Ancak karakterler soru işaretine dönüşmüşse bilgi kaybolmuştur.
Alan adlarında Türkçe karakter kullanılabilir mi?
Teknik olarak mümkündür ama e-posta, paylaşım ve yazım kolaylığı açısından genellikle önerilmez.
Sonuç
Karakter sorunlarının çoğu, sistemin bir noktasında UTF-8 dışı bir varsayımdan kaynaklanır. Dosya, veritabanı, web sayfası ve kod genelinde UTF-8'i standart haline getirmek bu sorunları kalıcı olarak çözer.