Merhaba,
amacim sizin arastirmadan soru sordugunuzu dile getirmek filan degildi.
Bu sekilde bir dusuncem olmadi. Sadece bu konuda uzun zamandir sorun
yasadiginizi ve bir yerlerde gozden kacirdiginiz birseyler olabilecegini
vurgulamak istedim.

karakter set olayi temelde birkac basligi olan bir konu. Bunun php veya
bir programlama dili ile dogrudan iliskisi yok. Veriyi saklarken
karakter set belirlersiniz, birde gosterirken. Eger saklarken karakter
set UTF8 olsun der sonra gosterirken farkli bir set olsun derseniz o
zaman bunu ya db sunucunuzun donusturmesi ya da uygulama tarafinda sizin
donusturmeniz gerekir. UTF-8 temelde ingilizcede olmayan karakterlerin
kullanilmasi icin gelistirilmistir. Siz "A" yazdiginizda bu "A" olarak 1
byte olarak saklanir. Ancak "Ğ" yazmak istediginizde bu iki byte
uzunlugunda bir karakter olarak saklanir.  UTF-8 bircok dili ayni anda
iceren genis bir settir. Bu nedenle sadece turkce kullanilacak bir proje
icin eger db boyutu onemli ise (diyelim ki 10 TB veri saklamak
gerekiyor) o zaman sadece o dile has olusturulmus karakter set ile veri
kaydedilebilir. Ornegin Latin5 (ISO-8859-9). Bunda durum utf-8 gibi
degildir. Tum set sadece turkce karakterleri icerir diyelim. 

Buna gore siz veritabaninizda (mysql icin) tum tablolarinizi veya her
field icin ayri ayri dil seti kullanabilirsiniz. Ancak latin1 (isvecce)
setindeki bir tabloya turkce karakter basarsaniz o zaman db ile
kulahlari degisirsiniz.
Burada muhim olan ikinci nokta devreye girer. O da veritabanindan
saklandigi formattaki veriyi hangi set olarak isteyeceginizdir. Mysql
default olarak latin1 kabul eder (hala oyle mi bilemiyorum). Bunun
anlami client tarafinda (php olabilir baska bir client olabilir) veri
cekilecegi zaman mysql veriyi client default karakter setine gore
gondermek istemesidir. Eger siz mysql konfigurasyonunda global olarak
benim client'larimin karakter setleri latin5 derseniz, sakladigi veri
utf-8 ise veriyi latin5 olarak cevirip gondermek ister. Arada japon
karakteri varsa hata alirsiniz (mi emin degilim belki warning donuyordur
ya da o karakterleri atlayarak gonderiyordur bilemeyecegim. pg tarafinda
error alirsiniz.) 

Birde ikinci yontem olarak client db sunucuya kendi karakter setinin ne
oldugu bilgisini gonderir ve veriyi ona gore hazirlamasinin talimatini
verir. set name muhabbeti budur. Buna gore sizin client tarafinda da iki
konu onem arzeder. 

Uygulama kodlarinizin icerisindeki ekrana basilacak kisim hangi dilde
kayededilmis ise taryiciya sayfanin karakter setinin de o oldugunu
bildirmeniz gerekir. Ornegin. veri_goster.php dosyaniz icerisinde
kodlama yaparken, editor-ide her ne kullaniyorsaniz, kaydetme islemini
utf8 yaptiniz. sonra html meta tag ve header'da karakter set olarak utf8
yazdiniz.bu php dosya icerisinde echo "merhaba TÜRKİYE"; yazdiniz ve
altina da veritabanindan gelen bir veriyi basmak istediniz.

Eger db'de sakladiginiz veri latin5, db global degiskenleri icerisinde
client encoding latin5 ise ve siz kodunuzda "set name" ile herhangi bir
encoding belirtmemis iseniz bu durumda ekrana basacaginiz veride echo
ile yazdiginiz kisim normal gorunecek ama veritabanindan gelen kisim
bozuk gorunecektir. Tarayiciya header ve meta tag (explorer meta tag baz
alir, firefox header) olarak belirttigininiz karakter set iso-8859-9
yani turkce ise bu durumda veritabanindan gelen bilgi dogru gorunecek,
echo ile yazdiginiz bilgi bozuk gorunecektir. 

Yazim yanlisi filan varsa kusura bakmayin. yeniden okumadan
gonderiyorum :)



On Tue, 2012-02-21 at 10:15 +0200, Nuri AKMAN wrote:

> Merhaba Atıf Bey,
> 
> Zaman zaman karşıma çıkan bu karakterset konusunu Google ve sizlerin
> desteği ile çözme gayretindeyim.
> 
> Google'da php mysql utf8 encoding problem araması yaptığımda,
> google'ın 1 milyondan fazla sonuç bulduğunu gördüm. Sanırım sizin
> tespit ettiğiniz mesajlar da bu rakama dahil :)
> 
> Keşke tüm sorunlar sadece bir doküman okunduğunda çözülebilecek kadar
> kolay olsaydı da, biz programcılar anlamsız sorunlar için google
> araması yapmakta geçen zamanımızı sosyal etkinliklerde kullanabilsek!
> 
> Son olarak; Sadece bu konuda değil, her konuda elimden geldiğince
> araştırma yapmaya çalışıyorum. Çoğu zaman çözüme ulaşıyorum. Neticeye
> varamayınca da listedeki üstadlara başvuruyorum.
> 
> Selamlar,
> Nuri Akman
> 
> 
> 
> 2012/2/20 Atıf CEYLAN <[email protected]>
> 
>         Sayin Nuri Hocam,
>         Ben sizin ile karakter set olayini o kadar ozdeslestirmisim
>         ki, ufak bir google arastirmasi yaptim ve netice itibari ile
>         karakter set olayini basli basina bir arastirma konusu
>         yapmanizi oneriyorum. 
>         
>         2011 17 mayis'ta bir arkadas 
>         
>         
>         > Listelerden takip ettiğim kadarı ile bir süredir karakter seti ile
>         > ilgili sorun yaşıyorsunuz.
>         > 
>         > Aslında defalarca yaşadığınız sorunu çözen yanıtlar aldınız ancak
>         > sanıyorum bir noktada bir şeyler yanlış gidiyor.
>         
>         
>         seklinde baslayan bir mail yazmis, 
>         
>         2009 kasim 24'te yine benzer bir soru sormussunuz ve yine ayni
>         konu etrafina bir suru arkadas yazmis. 
>         
>         > Arkadaşlar,
>         > 
>         > MySQL database'de Latin5 olarak oluşturulmuş bir tablom var. Bu 
>         > tablodaki verileri UTF-8 formatlı bir PHP dosyamda kullanmka 
> istediğimde 
>         > TR karakterler bozuk geliyor. Dosyanın UTF-8 olan türünü ANSI 
> yapınca da 
>         > ekrandaki diğer yazılar bozuluyor.
>         > 
>         > Bu sorunu MySQL'deki tablomu UTF-8'e çevirmeden çözebileceğim bir 
> metod 
>         > var mıdır?
>         > 
>         > Selamlar,
>         > Nuri Akman
>         
>         
>         Acikcasi bu konuyu cidden arastirmanizi oneriyorum.
>         
>         
>         
>         -- 
>         
>         /**
>          * @author Atıf CEYLAN
>          * Software Developer & System Admin
>          * http://www.atifceylan.com
>          */
>         
>         
>         _______________________________________________
>         Linux-programlama mailing list
>         [email protected]
>         https://liste.linux.org.tr/mailman/listinfo/linux-programlama
>         Liste kurallari: http://liste.linux.org.tr/kurallar.php
>         
> 
> 
> 
> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> https://liste.linux.org.tr/mailman/listinfo/linux-programlama
> Liste kurallari: http://liste.linux.org.tr/kurallar.php


-- 

/**
 * @author Atıf CEYLAN
 * Software Developer & System Admin
 * http://www.atifceylan.com
 */
_______________________________________________
Linux-programlama mailing list
[email protected]
https://liste.linux.org.tr/mailman/listinfo/linux-programlama
Liste kurallari: http://liste.linux.org.tr/kurallar.php

Cevap