Turning gears are the logo of co-scripts

İnternette farklı nedenlerden kaynaklanan farklı Türkçe karakter görüntüleme sorunlarına rastlamışızdır. Benim de başıma pek çok defa nedenleri farklı sorunlar geldi. Her seferinde konuyu da tam anlamadan çözümler ürettim. Ancak sıfırdan mysql ve php ile bir uygulama hazırlayacaksanız, özellikle Türkçe karakter desteği gerekiyor ise önce şu sayfadaki temel bilgileri okumanızı öneririm. Buradaki bilgiler yeterli gelmezse aynı sayfada bahsedilen kavramları google'dan arayarak detaya inebilirsiniz.

Olayda 2 temel müdahil var. Birisi sunucu (MySQL) diğeri browserımız. Elimizdeki veriyi sunucuya gönderdiğimizde istediğimiz şekilde kaydedilmesi için gereken ile talep ettiğimizde sunucunun bize istediğimiz şekilde vermesi kısmı sunucu ayarları ile ilgili. 

Sunucudan istenilen formatta gelen verinin browser'da istenildiği gibi görünmesi ise html meta taglarımızla alakalı. Ancak bilmekte fayda var, sunucu verisi ana kriter. Yani sunucudan istenilmeyen formatta gelen veriyi browser istenilen formatta gösteremez.

Şimdi utf8 kabaca çok fazla dile destek veren bir karakter setleri koleksiyonu1. Ancak bazı dillere özel karakterlerin eklendiği (ve dile özgün çeşitlendirildiği, çevirimler içeren) sunumları var.Dilimize özgü bir sayfa hazırlayacaksak,yine de, utf8_unicode ve utf8_general'dan farklı olarak dilimize özgü utf8_turkish_ci setini kullanmalıyız. 

Karakter setine karar verdikten sonra, veri tabanının karşılaştırma setini (Genel Ayarlar-Sunucu bağlantısı karşılaştırması) utf8_turkish_ci olarak seçiyoruz. Tablomuzu oluştururken/oluşturduktan sonra (henüz boşken) İşlemler>Karşılaştırma seçeneğinden yine utf8_turkish_ci seçildiğini kontrol edelim.

Bundan sonra tablolarda metin tipi değişkenlerde mutlaka "karşılaştırma" kısmında utf8_turkish_ci olduğunu teyit ederek gidelim.

Tüm bunlar sunucunun metin tipi verileri alırken,saklarken,verirken utf8_turkish_ci kullanacağını, farklı bir karakter gelirse bile bu setteki karşılıklarına çevireceğini gösterir.

Sunucuyu bu şekilde sağlama alınca istemciye gitmeden önce php tarafında yapılacak tek şey var (başkaca çözümleri olsa da), pek çok fonksiyon ve 3-4 satırdan oluşan PDO komut grubunun dışında, PDO bağlantı tümcesine tek bir değişken eklemek yeterli oluyor. Bu hem veriyi sunucuya verirken hem de sunucudan veri çekerken işleri yoluna koyacaktır.

Örneğin:

	$db = new PDO('mysql:host=localhost;dbname='.$vtAdi.';charset=UTF-8', $vtKullaniciAdi, $vtParolasi,[PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"]);

 

Eklenen son parametre: [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"] php ayağını da sağlama alır.

Daha sonra herkesin bildiği meta tagı html içine koyduğunuzda (veya css ile ilgili @ eklendiğinde) herşey tam olarak TR karakterlerde hem okunur hem yazılır. Üstelik phpMyAdmin içinde de karakterler doğru görünür ve istediğiniz gibi manuel TR giriş yapsanız da bozulma olmaz.

TR karakter sorununa başka bir şekilde de rastlayacağımız kesin, çünkü halâ bilgi eksiğimiz var ve devşirme çözümlerle devam ediyoruz. Kolay gelsin...

co-scripts tag image turkce karakter sorunuutf8utf8_turkish_cimysql turkce karakter problemipdomysql_attr_init_commandset namesphp
ID:270 | Okunma:2460


 

Karşılaşılan sorun düzenlediğimiz html,asp veya php sayfasının sunucuya yolladıktan sonra kullanıcıya gönderdiği halinde Türkçe karakterlerin doğru görünmemesi veya hiç görünmemesi şeklide kendini gösteriyor.

Ben bir süredir beni oyalayan sorun için biraz araştırma yaptım ve ASP sayfaları için bir çözüm ürettim (elbette internet taramalarında bu sonuca vardım.) Ancak sanıyorum varsayılan ayarları US yada UK İngilizcesi olan sunucularda bu çok fazla işe yaramayabilir.

Bu yazıdaki kodlara bakınız.

 

Aşağıdaki standart makalelerinde ve yetkili kurum sayfalarında gerekli açıklamalar mevcut.

Response.Charset , Response.CodePage , Session.CodePage ,W3C Character Encodings , Character Set ,UTF-8, Setting HTTP Charset

Notlar: 

  • Metin temelli ASP, html, htm, js, vbs, php, css, xml gibi dosyalarınızı BOM1,2 bilgisi içermeyen utf-8 tipinde kaydedin
  • Metin editörünüzün kayıt ayarlarını BOM'suz utf-8'e çevirin
  • Dil ek bilgisi taşıyan ANSI tipindeki metin temelli dosyalarınızı da utf-8'e çevirin.
  • Dosyaları (klasörün tamamını da) ANSI'den utf-8 e topluca çeviren yazılımlar vardır.
  • 65001 kodu UTF-8'i işaret eder
  • include tekniğinde içerilen (çağrılan) sayfa ana sayfanın karakterseti ve kod sayfası tipine uyabilir ama uymama olasılığı da var.
  • server.execute tekniğinde çalıştırılan sayfa ana sayfanın karaktersetini taşımaz ve kod sayfası tipine uymaz.
  • Sayfanızın browser tarafından yanlış encode edilmemesini garantilemek için en son olarak sayfanızın head kısmı içine 
     
    

    kodunu eklemeyi unutmayın.
  • CSS dosyasının en üstünde @charset "UTF-8"; olarak kullanabilirsiniz. Böylece css dosyanız ile stil verdiğiniz html dosyası aynı encode içerirler.
  • Apache sunucuda .htaccess ile karakter encoding
  • Sunucunuzdaki veritabanı özellikle sql ise collation başka bir dilde olabilir. Kontrol etmelisiniz.
  • BOM nedir? Kısaca fazladan karakter tanımlamak için oluşturulmuştur. (Byte Order Mark). Özellikle metin tabanlı dosyanın başına hatalı algılanan karakterler yerleştirir ve farklı bir kayıt tipidir. UTF-8 için gereksizdir denebilir. UTF-16 da kullanımı yaygındır. Standart utf-8 kullanmadığınızda Header bilgisini bozduğundan hata verdirir. BOM'lu utf-8 genellikle dosya TR karakter içeriyorsa sorun çıkartır. Tüm editörlerde BOM'suz utf-8 kayıt mümkündür.
  • Dil kodu belirtme önceliği şu şırayladır.
  •  
  • 1- HTTP Content-Type
  • 2- XML deklare etme
  • 3- Meta charset deklare etme
  • 4- Link charset özelliği
co-scripts tag image turkce karakter sorunuutf-8bomansiencoderesponse.charsetresponse.codepage
ID:206 | Okunma:10946