Türkçe Karakter Sorunları: UTF-8 ve Veritabanı Ayarları
İçindekiler
Web sitenizde "şeker" yerine "ÅŸeker" veya "ılık" yerine "ılık" gibi garip karakterler görüyorsanız, büyük ihtimalle bir karakter seti uyumsuzluğu yaşıyorsunuz demektir. Bu sorun özellikle site taşıma, yedekten geri yükleme veya farklı sistemler arasında veri aktarımı sonrasında ortaya çıkar.
Karakter seti nedir?
Bilgisayarlar metni sayılar olarak saklar. Karakter seti (encoding), hangi sayının hangi karaktere karşılık geldiğini belirler. Eski sistemlerde Türkçe için ISO-8859-9 veya Windows-1254 gibi karakter setleri kullanılırdı. Bugün web'in standart karakter seti UTF-8'dir ve dünyadaki neredeyse tüm dillerin karakterlerini destekler.
Sorun, metnin bir karakter setiyle kaydedilip başka bir karakter setiyle okunmasıyla ortaya çıkar. "ÅŸ" gibi görüntüler, UTF-8 ile kaydedilmiş bir metnin eski bir karakter setiyle okunmasının tipik sonucudur.
MySQL'de utf8 ve utf8mb4 farkı
MySQL'de tarihsel olarak "utf8" adıyla bilinen karakter seti, aslında UTF-8'in yalnızca bir kısmını destekler (karakter başına en fazla 3 bayt). Bu karakter seti Türkçe karakterleri saklayabilir; ancak emoji ve bazı özel semboller gibi 4 baytlık karakterleri saklayamaz. Bu karakterler girildiğinde metin kesilebilir veya hata oluşabilir.
"utf8mb4" ise UTF-8'in tamamını destekler. Yeni projelerde veritabanı, tablolar ve bağlantı için utf8mb4 kullanmak önerilen yaklaşımdır.
Karşılaştırma (collation) ve Türkçe
Collation, metinlerin nasıl sıralanacağını ve karşılaştırılacağını belirler. Türkçe için önemli bir ayrıntı vardır: Türkçede "i" harfinin büyüğü "İ", "ı" harfinin büyüğü "I"dır. Birçok dilde ise "i" ve "I" çifttir.
- Genel (unicode) karşılaştırmalarda bazı aramalarda İ/i ve I/ı eşleşmeleri beklenenden farklı sonuç verebilir.
- Türkçeye özgü karşılaştırma (örneğin utf8mb4_turkish_ci) Türkçe sıralama ve büyük-küçük harf kurallarına uyar.
Hangisinin seçileceği, uygulamanın ihtiyacına bağlıdır. Çok dilli bir sitede genel bir collation tercih edilip Türkçe özel durumlar uygulama tarafında ele alınabilir.
Karakter seti zincirinin tamamı uyumlu olmalı
Türkçe karakterlerin doğru görünmesi için zincirin her halkası aynı karakter setini kullanmalıdır:
- Veritabanı, tablo ve sütunların karakter seti
- Uygulamanın veritabanına bağlanırken kullandığı karakter seti
- PHP dosyalarının kaydedildiği karakter seti
- HTML sayfasının bildirdiği karakter seti (meta charset)
- Sunucunun gönderdiği Content-Type başlığı
Bu halkalardan birinin farklı olması, karakterlerin bozulmasına yol açabilir.
Sık karşılaşılan senaryolar
Yedekten geri yükleme sonrası bozulma
Yedek alınırken ve geri yüklenirken kullanılan karakter setleri farklıysa sorun oluşur. Yedeğin karakter setini ve geri yükleme ayarını kontrol etmek gerekir. Yedekleme sürecini MySQL yedekleme rehberimizde anlattık.
Site taşıma
Eski bir hostingten yeni bir hostinge taşımada veritabanı varsayılan karakter setleri farklı olabilir. Taşıma adımlarını WordPress site taşıma yazısında ele aldık; mantık diğer PHP siteleri için de geçerlidir.
Excel'den aktarılan veriler
CSV dosyaları farklı karakter setleriyle kaydedilebilir. Excel'in CSV dosyalarını açarken Türkçe karakterleri bozması sık görülür; dosyanın başına UTF-8 işareti (BOM) eklemek bu sorunu genellikle çözer.
Adreslerdeki (URL) Türkçe karakterler
Sayfa adreslerinde Türkçe karakter kullanmak yerine bunları Latin karşılıklarına dönüştürmek ("şeker" yerine "seker") yaygın ve güvenli bir uygulamadır.
Bozulmuş veriyi düzeltmek
Veriler bozuk kaydedildiyse yalnızca ayarları değiştirmek yetmez; mevcut verinin dönüştürülmesi gerekir. Bu işlem dikkat gerektirir ve mutlaka önce tam yedek alınmalıdır. Yanlış bir dönüştürme veriyi daha da bozabilir.
Türkçe karakter ve veritabanı sorunlarının çözümü dahil teknik destek için özel yazılım hizmetimizi inceleyebilirsiniz.