Merhaba, genellikle web teknolojileri, web programlama dilleri, linux ile ilgili yazıların yazıldığı bir sitede bulunmaktasınız. Eğer bu konular ilginizi çekiyorsa yazılarıma abone olmanızı öneririm. Yazar hakkında ayrıntılı bilgi için tıklayın.

PHP+MySQL’de Türkçe Karakter Problemini Önlemek

HTML sayfanızı oluşturmadan önce hangi karakter setini kullanacağınıza karar vermelisiniz. Buradan görebileceğiniz üzere standartlaşan onlarca karakter kodlaması vardır. Karakter kodlaması, karakter setlerinden oluşur. ISO-8859, MS-Windows ve Unicode en çok kullanılan karakter kodlamalarındandır. ISO-8859-9′da bir ISO-8859′un bir karakter setidir.

ISO-8859 karakter seti dillere desteğini bölümler halinde vermiştir. İlk bölümde -bu bölüm ISO-8859-1 (Latin1) olarak bilinir- İngilizce, Franszıca, İspanyolca, Portekizce gibi dillere destek vermiştir. Türkçe desteği ancak 9. bölümde ISO-8859-9 (Latin5) karakter setiyle gelmiştir. MySQL’de bulunan latin5 ile ISO-8859-9 aslında aynı şeylerdir.

Türkçe diline destek veren karakter setlerinden en çok kullanılanları; ISO-8859-9 (latin5) Windows-1254 ve UTF-8‘dir. UTF-8 çoklu dil desteği olan bir karatker setidir. Yani Türkçe’nin yanında örneğin Rusça’ya da destek vermektedir. Diğerlerinden farkı daha çok dile destek verdiğinden dosya büyüklükleri biraz daha fazla olabilmektedir.

Size önerim her zaman UTF-8 kullanmanız. Örneğin WordPress her ülkeden her dilden kullanıcıların yazı yazarken karakter problemi ile karşılaşmaması amacıyla UTF-8 kodlamasını kullanmaktadır. Şimdi bir siteye başlamadan önce Türkçe karakter problemi ile karşılaşmamak için yapmanız gerekenleri sırayla anlatacağım..

Html ve php dosyalarınızı yazarken özgür yazılım ürünü olan Notepad++ programını kullanmanızı öneriyorum. Sitenizi oluşturmaya, html ve php kodlarınızı yazmaya başlamadan önce notepad++’ı açıp Format menüsünden UTF-8 without BOM‘u seçin ve dosyalarınızı utf8 formatını kullanarak yazın. Notepad++’ın Settings>Preferences>New Document bölümünden de her açılışta dosya formatını otomatik olarak utf-8 without bom seçmesini sağlayabiliriz.

Daha sonra html kodlarınızı yazmaya başlayabilirsiniz. HTML ile de sayfanızın karakter setini UTF-8 olarak ayarlamanız gerekiyor. <head></head> etiketlerinin arasına yerleştireceğiniz aşağıdaki kod ile bu işi yapacağız.

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

Şimdi MySQL veritbanımızı oluşturalım.. Veritabanımızı oluştururken Karşılaştırma bölümünden utf8_turkish_ci yi seçmenizi öneriyorum. Böylelikle MySQL’de oluşturacağınız tüm tablo ve alanlar utf8 kodlamasına göre oluşturulacak. Artık MySQL’den veri girişi yaptığınızda Türkçe karakter problemi olmadan verilerinizi görebiliyor olmalısınız.

PHP kodlarıyla MySQL’e bağlanırken yapmamız gerekn bir şey daha var. SET NAMES utf8 kodunu çalıştırmak.. Bunu da şu şekilde yapıyoruz;

<?php
mysql_connect("localhost","root","1234");
mysql_select_db("deneme");
mysql_query("SET NAMES UTF8");
?>

Bunları yaptıktan sonra Türkçe karakter problemiyle karşılaşmamanız gerekiyor… Ben böyle yapıyor ve hiç Türkçe karakter problemi ile karşılaşmıyorum.

Creative Commons License
Java Dergisi

48 Yorum

PHP+MySQL’de Türçe Karakter Problemini Önlemek

Bu yazıda PHP ve MySQL ile site oluştururken Türkçe karakter problemi ile karşılaşmamak için yapılması gerekenler anlatılıyor..

hocam dediklerini yaptım ama nafile.hala aynı durum.depolama ayarında sorun olabilir mi? bende MyIsam seçili InnoDb falan mı seçsem?

Hüseyin Berberoğlu Ekim 28th, 2007, 14:51

myisam ile alakalı olacağını sanmam.. sanırım sizde Türkçe karakter problemi oluşmuş. Bu yazıda Türkçe karakter problemi yaşamamak için önceden yapmanız gerekenleri yazdım..

ne tür bir problem yaşadığınızı daha ayrıntılı söylermisiniz ? mysql’deki tüm alanlarınızın karakter setleri türkçe karakter destekliyor mu ? html dosyanızın karakter seti doğru ayarlanmış mı ?

sorun çözüldü.veritabanını üretirken karşılaştırma bilgisini utf8_unicode_ci yaptım sonra bunu tabloyu üretirken de kullandım.Yani tablo karşılaştırma bilgisi için de aynı karakter setini kullandım.şu ş ler ve ç ler ve ı lar sayfamda cirit atıyor oh be:D

Hüseyin Berberoğlu Ekim 29th, 2007, 02:08

sorunun çözüldüğüne sevindim :)

işin içine girince çok faydalı bir yazı olduğunu anladım :) Teşekkürler Hüseyin.

benimde işimi kolaylaştırdı bu yazı. sürekli yaşadığım bir sorundu bu. teşekkürler

Filtreleme olaylarında sorun yaşıyorum, sistem aynı sizin anlatmış olduğunuz şekilde. Mesela “İ” ile başlayan kayıtları getirmek istediğimde (alan_adi LIKE ‘İ%’) şeklinde yapılan sorgularda sorun oluşuyor.İ% boş dönerken I% da İ ile başlayanlar dönüyor. Collation doğru ayarlandı. URL den gönderiyorum harfleri,orada Türkçe karakterler sorunlu, encode edilmiş olarak çıkıyordu, onları utf8 enco edip post etmeyi denedim o da işe yaramadı, bilmem nerede hata yapıyoruz?

Hüseyin Berberoğlu Şubat 20th, 2008, 16:05

utf8_general_ci yerine utf8_turkish_ci yi deneyin. post ile gönderme imkanınız varsa post ile göndermeyi deneyin.

yazdığınız sorguyu phpmyadmin kullanarak çalıştırıp denediniz mi ? orada bir sonuç çıkıyor mu ? İ% gibi yazdığınızda

@neXuS
Adınızla proje adının nerdeyse aynı olması ne büyük rastlantı aşağıdaki adrese bakabilirseniz sevinirim..

http://www.nexusartline.com/component/option,com_nexus/Itemid,67/lang,tr/

Hüseyin Berberoğlu Şubat 20th, 2008, 22:38

sizin için bir deneme yaptım, bir tablodaki alana İstanbul Istanbul istanbul ıstanbul gibi veriler girdim,

SELECT * FROM tablo WHERE alan LIKE ‘İ%’
SELECT * FROM tablo WHERE alan LIKE ‘i%’
SELECT * FROM tablo WHERE alan LIKE ‘I%’
SELECT * FROM tablo WHERE alan LIKE ‘ı%’

sorgularının hepsi doğru sonuç verdi.. Karşılaştırma olarak utf8_turkish_ci kullanıyorum.

Hem tablolarınızın hem de phpmyadmin deki “Yapı” bölümündeki alanlarınızın özelliklerindeki “Karşılaştırma”ların utf8_turkish_ci olduğunu kontrol edin. bazen alanların karşılaştırmasını düzeltmeyi unutabiliyoruz.

sadece verdiğiniz linke bakınca sorun şu gibi gözüküyor : urlde “letter,%C4%B0″ gibi bir şeyin oluşması, sorgunun da LIKE ‘%C4%B0%’ gibi olabileceği.. sanırım decode ederken problem çıkıyor.. o bölümün kodlarını da görsem başka bir çözüm belki söyleyebilirim

eline sağlık.. işe yarıyor :)

Hüseyin Bey merhabalar,
Uzun uğraşlar sonucu halledemediğim problemi sayenizde çözdüm. Çok teşekkür ederim
İyi çalışmalar.
Sercan

uft_turkish_ci yerine wordpress’te de olduğu gibi utf8_general_ci kullanmanızı tavsiye ederim. Çoklu dil içeren sitelerde bunu kullanmanızda fayda var.

Hüseyin Berberoğlu Aralık 13th, 2008, 18:41

@Aydın Yakar evet utf8_general_ci de olabilir, Türkçe kullanılacaklarda turkish de problem çıkarmayacaktır.

turkish ile general’in farkı turkish’te mysql’de sql ile yapacağınız karşılaştırmaları Turkiye yereline göre yapması gibi bir şeyler hatırlıyorum, ancak çoktan böyle şeylerle uğraşmadığım için emin olamadım.

mysql_query(“SET NAMES UTF8″) çok önemli. Yazınca düzeldi. Teşekkür ederim.

Allah razı olsun diyorum, başka da bişey demiyorum…

Hüseyin Berberoğlu Ocak 20th, 2009, 14:20

Güzel yorumlarınız için teşekkürler :)

MySQL db oluştururken utf8_general_ci kullandım,
db bağlantısını yaparken SET NAMES UTF8 kullandım,

yine de türkçe karakterlerden Ç ve Ü karakterleri Ç şeklinde çıkıyor :(

Hüseyin Berberoğlu Ocak 27th, 2009, 22:45

Oluşturduğunuz tablodaki ilgili alanın kodlaması da utf8 olmalı.

Problemi çözdük, htmlentities() fonksiyonu türkçe karakterlerde sorun çıkarıyormuş, arkadaş gerekli düzenlemeyi yaparak sorunu çözdü. Şuanda herhangi bir problem yok.

Tşkrler..

hocam görünümde genel anlamda bende sıkıntı yaşamıyorum fakat veri tabanında türkçe karakterler tanınmaz bi halde oluyo bunun sebei nedir düzeltilmesimümkünmüdür cevap yazarsanız çok sevinirim …

Tüm bu anlatılanların yanısıra, php sayfalarınızın hemen başına şu kodu eklemeniz Türkçe karakter sorununuza yardımcı olabilir.

Hüseyin Berberoğlu Haziran 3rd, 2009, 13:52

@hüseyin iskender; kodu bir daha alalım olmadan.

Sanırım php taglarını koda dahil ettiğim için yorum sistemi kodları kaydetmedi, şimdi kodları ascii karakterlere çevirip yeniden deniyorum…

<?php
header(‘Content-Type: text/HTML; charset=iso-8859-9′);
?>

Tek tırnaklara dikkat edin eğer kopyalayıp yapıştırırsanız çalışmayabilir, tırnakları kendiniz klavyeden değiştirin. Ben bu kodu çok kullandığım için paylaşıyorum, gerçekten işe yarıyor, umarım faydalı olmuştur.

Hüseyin Berberoğlu Haziran 5th, 2009, 18:01

@Hüseyin kod gözüktü teşekkürler.

Bu koda eğer kod yazarken UTF-8 kullanırsak gerek olmamalı aslında. Ama dediğin gibi denenebilir. Teşekkürler.

iyi günler hüseyin hocam;

Benim sitemde de türkçe karakter sorunu çıktı. Anasayfada böle bir sorun yok. sadece kullanıcılar yorum ve özel mesaj yollarken bu durum söz konusu oluyor. siteye makale eklediğimde böle bi sorun yok. sizce bunu sebebi ne olabilir.

Yardımlarınızdan dolayı şimdiden teşşür ediyorum.

Hüseyin Berberoğlu Haziran 21st, 2009, 12:43

@updown, her tabloya özel collection (karşılaştırma) tipi vardır. Senin veri tabanında sorun çıkaran tablolar ile sorun çıkarmayanları karşılaştırmanı öneririm. Hepsini sorun çıkarmayan karşılaştırma tipine örneğin utf8_general_ci’ye ayarlarsan sorunun düzelir diye düşünüyorum.

sitemin karşılaştırma tipi: latin5_turkish_ci, bu bi sorun teşkil ediyormu?

Hüseyin Berberoğlu Haziran 23rd, 2009, 10:04

@updown Tüm veritabanınun değilde doğru çalışan tabloların karşılaştırma tipine bak, eğer doğru çalışan tablolar utf8 li bir şey ise veritabanının karşılaştırmasını ve diğer farklı karşılaştırmaya sahip olan tabloların da karşılaştırmasını doğru çalışan karşılaştırmaya ayarla.

Arkadaşlar internetten bulup denemediğim yontem kalmadı.

Veritabanı ve php dosyam utf-8

Yinede sonuc bu “D�?�nce”

phpmyadminde herşey düzgün görünüyor fakat ben çekince boyle saçma karakterler görünüyor.

yardım edin lütfen kafaı yiycem :(((

Hüseyin Berberoğlu Haziran 30th, 2009, 10:06

@tolga şu satırı bağlandıktan sonra ekledin mi ?

mysql_query(“SET NAMES UTF8″);

Ekledim.

Ayrıca bunlarıda;

header(‘Content-type: text/html; charset=utf-8′);

mysql_query(“SET NAMES utf-8″);
mysql_query(“SET CHARACTER SET utf-8″);
mysql_query(“SET COLLATION_CONNECTION = ‘utf8_turkish_ci’”);

Ve eminimki php dosyamda utf-8 olarak encode edildi

latin5′e geçmek istemiyorum ama son çare olarak düşünüyorum.

Diğer arkadaşlar bunları yaptıklarında hiç sorun çıkmadığını yazıyor bende neden olmuyor hala anlamadım ..

Hüseyin Berberoğlu Haziran 30th, 2009, 10:26

@tolga phpmyadmin’de ilk ekranda “Veritabanları” var o sayfanın ekran görüntüsünü, daha sonra ilgili veritabana tıkladığında açılan sayfanın ekran görüntüsünü yollar mısın.

Eğer notepad++ kullanıyorsan projedeki tüm dosyaları UTF-8 without BOM ile kaydetmeni öneririm.

Birde şu var;

utf-8 olan veritabanını latin5 e çeviriyorum phpmyadmin “bazı karakterlerde sorun oluşabilir ve ? şeklinde görebilirsiniz” şeklinde uyarı veriyor . Herneyse çeviriyorum latin5 e phpmyadminde gerçekten türkçe karakterler ? olarak görünüyor fakat bu sefer benim sitede düzgün çıkıyor.

2 gündür bununla uğraşıyorum fikri olan ?

Hüseyin Berberoğlu Haziran 30th, 2009, 14:17

@tolga yolladığın iki resim de aynı. Ve benim istediğim sayfa değil burası. Bu gönderdiğin resimde üst menüde en solda Veritabanları var ona tıklayıp açılan ekranın ekran görüntüsü ve db adlı veritabanına tıkladığında açılan tüm tabloların listelendiği sayfanın ekran görüntüsünü gönderebilir misin

pardon ya kafam iyice bulanmış :)

ama gerek kalmadı latin5 e çevirdim herşeyi düzeldi

ilgilendiğiniz için teşekkürler

yaaa şimdi şöle ben mysql front kullanıorum veritabanıma şşşşşğğğ gibi karakterler girdiğimde aynı şekilde gösterioo ama sitemde bu karakterler tuhaf görünüyo mysql front ta karakter düzeni utf8 karşılaştırma : utf8_general_ci sisce ne yapmalıyım şimdiden teşekkürler.

anlamayan arkadaşlara bir daha yazıorum karakter düzeni utf8 karşılaştırma : utf_general_ci veritabanıma kendim elle veri girdiğimde ş harfi ğ harfi gibi harflerde sorun çıkmıyor ve php sayfamda düzgün görünüyor. Ama php sayfamdan veri girişi yapacağımda veritabanıma ş – ğ gibi harfleri doğru girmiyor karakteri farklı giriyor sizce sorun ne olabilir lütfen yardım edin kafayı yicem :(((

benim türkçe karakterden yana sorunum yok ama http://siteismi.com/ığüşıçğışüçö gibi bir şeyler yazdığımda url link bu hali alıyor; http://siteismi.com/%FD%F0%FC%FE%FD%E7%F0%FD%FE%FC%E7%F6 buda google indexlemesinde büyük sorun yaratır.
bunu için çözüm var mı?

hay Allah razı olsun 2 saattir işin içinden çıkamamıştım :)

Hüseyin Berberoğlu Ocak 20th, 2010, 15:43

@etem ş’yi s’ye ğ’yi g’ye vs. donüştüren kodlar var, onları kullanabilirsin

Harikasın arkadaşım, boşuna işkence çekiyormuşum ben, mysql i de çöp kutusu gibi kullanıyomuşum meğer :) al verileri ne olduğunu anlamadan depola… sonra zaten hep fulltext aramalar da bidünya sorunluydu…

bi set name ile bitti olay ;)

şimdi işin kolay tarafı kaldı, 2200 kaydı teker teker düzenlicez artık :)

ý -> ı gibi…

baştan utf8 kaydedilmedikleri için…
keşke bunun da bi kolay yolu olsaymış,

Hallettim onu da çok şükür,

ý -> ı vb karakter sorunlarını

CONVERT(CONVERT(CONVERT(CONVERT(adi USING ‘latin1′) USING BINARY) USING ‘latin5′) USING ‘utf8′)

bu kodla dönüştürme yaptım bütün dertlerim çözüldü utf ile ilgili. mutlaka bi select ile sonucu deneyin derim ben.

ben apache2triad da dil sorunu yaşıyordum wamp a geçince sorun düzeldi

o değilde general_ci akar her türlü. (: ha bide header() gönderin :p

Yorum Yazın

Kısa da olsa bir yorum yazmanız yazar için çok önemli.
Yorumunuz