Sihirli Fasulyeler
Yükleniyor...
PHP Türkçe Karakter Sorunu
 Web-Tasarım   8235   11.11.17   11.11.17   0
phpdil.jpg

Bu makalemde PHP'de sıkça karşılaşılan Türkçe karakter sorunlarının çözüm yollarından bahsedeceğim. Bu sorunun en büyük kaynağı, HTML, PHP ve MySQL 'de kullanılan farklı veya Türkçe karakterleri desteklemeyen karakter kodlamalarının kullanılmasıdır. Bu teknolojilerde bulunan ve Türkçe karakterlerini destekleyen UTF-8 karakter kodlamasının kullanımı bütün sorunlarınızı çözecektir.

 

Bunların yanında kod yazmada kullandığınız editörün kullandığı karakter kodlaması da UTF-8 olmalıdır. Yani bütün ayarlamalarımızı UTF-8 olarak yapmamız gerekiyor.

 

HTML'de Karakter Kodlaması

Aşağıdaki komutun HTML yapınızdaki "<head> </head>" düğümleri arasında olduğundan emin olun.

 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 

PHP'de Karakter Kodlaması

PHP ile oluşturduğumuz sayfaların karakter kodlamasını UTF-8 yapalım. Her PHP sayfasının başlangıç kısmına aşağıdaki komutu ekleyin.

 
header('Content-Type: text/html; charset=utf-8');
 

Ayrıca veri tabanı bağlantısında, alınan bilgilerin UTF-8 karakter kodlamasına sahip olduğunu PHP'ye belirtmemiz gerekiyor. Bunu, kullandığımız PHP sürümüne göre "charset" veya "set names" komutlarını veri tabanı bağlantısı için kullandığımız PHP komutlarına ekleyerek yapabiliriz.

 

PHP 5.3.6 ve sonraki sürümler için örnek veritabanı bağlantısı.

 
$kullanici_adi = ''; 
$sifre = ''; 
try {
   $db = new PDO('mysql:host=localhost;dbname=veritabani_adi;charset=utf8',$kullanici_adi,$sifre);
} catch (PDOException $e) {
   print "Hata!: " . $e->getMessage();
   die();
}
 

PHP 5.3.6'den önceki sürümler için

 
$kullanici_adi = ''; 
$sifre = ''; 
try {
   $db = new PDO('mysql:host=localhost;dbname=veritabani_adi',$kullanici_adi,$sifre);
   $db->exec("set names utf8");
} catch (PDOException $e) {
   print "Hata!: " . $e->getMessage();
   die();
}
 

MySQL'de Karakter Kodlaması

 

Öncelikle eğer bilgilerinizin olduğu bir veri tabanınız varsa mutlaka yedeğini alın. İlk kontrol etmemiz gereken yer, PHPMyAdmin anasayfasındaki Sunucu bağlantı karşılaştırması (Server connection collation) kısmıdır. Bu alanın karakter kodlaması "utf8_general_ci" olmalı.

  UTF8  

Daha sonra PHPMyAdmin sayfasında, veritabanınızı oluşturan tablolarınızı seçerek, tablolarda yer alan alanların karakter kodlamalarını kontrol edin. Bu alanların dil kodlamalarının "utf8_general_ci" olmasını sağlayın.

  UTF8  

Kod Editör Ayarları

 

Yukarıdaki yazılanları deneyip de hala Türkçe karakter gösteriminde problem yaşıyorsanız, kodlamayı yaptığınız editörde de bazı ayarlamalar yapmanız gerekmekte. Veritabanı bağlantısı yaptığınız PHP dosyalarınızın kullandığınız editör tarafından UTF-8 BOM'suz olarak (Byte Order Mark) kaydedildiğinden emin olun. Eğer "Sublime" editörü kullanıyorsanız özel bir ayar yapmanıza gerek yok, varsayılan karakter kodlamaları zaten BOM'suz şekilde yapılır (BOM seçilmedikçe). Emin olmak için PHP veri tabanı bağlantısı dosyalarınızı sublime'da açın ve menüden "File - Save width Encoding - UTF8" seçeneği ile tekrar kaydedin. Notepad++ kullanıyorsanız "Encoding - Karakter Kodlama" seçeneğinde UTF8 seçip dosylarınızı kaydedin. (Notepad++ 6.9.2 ve daha eski versiyonlarda "UTF8 without BOM" seçeneği seçilmeli)

 

Sublime Karakter Kodlaması

  UTF8  

Notepad++ Karakter Kodlaması

  UTF8  

Bu aşamalarla Türkçe karakter sorununuz çözülmeli. Zaman zaman yazıları bölme işlemlerinde de Türkçe karakter sorunuyla karşılaşabilirsiniz. Bu işlem için genellikle kullanılan PHP komutu "substr" komutudur. Fakat bu komut karakter sayısına göre değil, byte sistemine göre çalışır. O yüzden bu komutu kullanarak metin bölme işlemleri yaparsak ve ayrılan yazıdaki son karakter Türkçe karakter ise bu karakterler soru işareti şeklinde gösterilir. O yüzden Türkçe karakterler içeren metinleri bölme işleminde substr komutu yerine mb_substr komutunu kullanmak gerekiyor. Ayrıca mb_substr komutunda karakter kodlamasını da belirtebiliyoruz.

 

Örnek mb_substr Kullanımı

$ayrilan_yazi = mb_substr($yazi, 0, 300, 'utf-8');
 

Yukarıdaki komut, $yazi değişkenindeki metinin ilk 300 karakterini UTF-8 formatında alır ve $ayrilan_yazi değişkenine atar. Böylece bölme işlemi karakter sayısına göre yapıldığından herhangi bir sorun oluşmaz.

 

Diğer Ayarlar

 

Hala Türkçe karakter sorunu yaşıyorsanız, son olarak sunucunuzdaki PHP ayarlarınızı kontrol etmeniz gerekir. Bunu yapmanın en kolay yolu "phpinfo()" komutunu kullanmaktır. Bunun için bir php dosyası oluşturup, dosyaya

 
<?php phpinfo(); ?>
 

komutunu yazmanız gerekiyor. Oluşturduğunuz dosyayı sunucuza atıp, bir tarayıcı yardımıyla açmanız gerekiyor. Gelen ekranda PHP ile ilgili bütün bilgileri görebilirsiniz. Burada bakmanız gereken "default_charset" seçeneğidir. Bu seçeneğin UTF-8 olması gerekiyor.

  UTF8  

Eğer varsayılan karakter kodlamasında UTF-8 yerine başka bir karakter kodlaması varsa bunun değiştirilmesi gerekir. Bunu yapmak için "php.ini" dosyasına erişim izniniz olması gerekir. Eğer websiteniz paylaşımlı (shared) bir hostta yer alıyorsa, büyük ihtimal ile erişim izniniz olmaz. Erişim izniniz olsa da olmasa da en kolay yol hosting firmanız ile iletişime geçip karakter kodlamasını UTF-8 olarak değiştirtmeniz olacaktır. Aksi takdirde (erişim izniniz varsa) SSH ile sunucunuza bağlanmanız, bir editör ile php.ini dosyasına ulaşmanız ve "default_charset" seçeneğini değiştirmeniz gerekir.

 

Güvenlik Uyarısı "phpinfo()" komutu websiteniz için bütün kritik ayarları göstermektedir. Bu ayarların başkaları tarafından görülmesi, websitenizin güvenliği açısından oldukça sakıncalıdır. PHP ilgili gerekli bilgileri öğrendikten sonra sunucunuzdan "phpinfo()" komutunun olduğu dosyanızı siliniz.

 

 Konuyu geliştirmemize yardımcı ol, konuyu değerlendir.
%75
%25

 

 Bu konuyu paylaş

 

 Yorum yaz, soru sor, geliştirme öner
E-Posta adresiniz yayınlanmayacak.

 

 İlk Yorumu Sen Yap