Ücretsiz araçlar

Tüm araçlar 47

Domain ve DNS

Alan adı, DNS, IP ve sertifika sorguları

Kategoriyi aç
Teklif al 0543 547 16 61 info@sezeryazilim.com

PHP ve web teknolojileri

Türkçe Karakter Sorunları: UTF-8 ve Veritabanı Ayarları

İçindekiler
  1. Karakter seti nedir?
  2. MySQL'de utf8 ve utf8mb4 farkı
  3. Karşılaştırma (collation) ve Türkçe
  4. Karakter seti zincirinin tamamı uyumlu olmalı
  5. Sık karşılaşılan senaryolar
  6. Yedekten geri yükleme sonrası bozulma
  7. Site taşıma
  8. Excel'den aktarılan veriler
  9. Adreslerdeki (URL) Türkçe karakterler
  10. Bozulmuş veriyi düzeltmek

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:

  1. Veritabanı, tablo ve sütunların karakter seti
  2. Uygulamanın veritabanına bağlanırken kullandığı karakter seti
  3. PHP dosyalarının kaydedildiği karakter seti
  4. HTML sayfasının bildirdiği karakter seti (meta charset)
  5. 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.

Bu konuda desteğe mi ihtiyacınız var?

Yeni bir web sitesi, e-ticaret projesi ya da özel bir yazılım ihtiyacınız varsa birkaç cümleyle anlatın; size uygun kapsamı birlikte belirleyelim.

Teklif al