Translate Blog

24 Ocak 2015 Cumartesi

Php Kelimeleri Büyük Harf Yazın, Türkçe Karakter Sorunu Çözümü / Turkish Encoding Problem on PHP

Yıllardır php ile uğraşırım şu gıcık Türkçe karakter olayından oldum olası çekmişizdir. Mesela veritabanınızda veya sayfanızda küçüklü büyüklü yazılmış saçma sapan isimler var. Bunları strtoupper ile hemen büyük harfe çevirebilirsiniz sanıyorsunuz, ama ne yazık ki öle olmuyor.

strtoupper("aşık veysel derki");
kodu
AşıK VEYSEL DERKI

şeklinde ıiş gibi türkçe harflerin saçma sapan ekranınıza yazıldığında sinirlernmekte haklı olduğunuzu görür ve google da aramalara giriştiniz. Umarım burayı hemen bulmuşsunuzdur.

Sorunu mb_strtoupper gibi bir kodun var olmadığını görmeyerek üzülmemiş olduğunuzu varsayarak devam ediyorum. (substr türkçe karakterlerde sorun yaratırken mb_substr($kelime,2,4,'utf-8') sorunu çözmekte ve mb_ ön ekli bir çok fonksiyon utf-8 encoding yaparak sorunların üstesinden gelmekte. )

Çözüm 2 fonksiyondan geçiyor.

 
function metintodizi( $string ) { 
 return preg_split('/(?<!^)(?!$)/u', $string ); 
} 
function strto($metin){
 $k_harf = array("a","b","c","ç","d","e","f","g","ğ","h","ı","i","j","k","l","m","n","o","ö","p","r","s","ş","t","u","ü","v","y","z","q","w","x"," ");
 $b_harf = array("A","B","C","Ç","D","E","F","G","Ğ","H","I","İ","J","K","L","M","N","O","Ö","P","R","S","Ş","T","U","Ü","V","Y","Z","Q","W","X"," ");
 $kalan='';
 $metin = metintodizi($metin);
 for($m=0;$m<count($metin);$m++){
  if(!array_search($metin[$m],$k_harf)){
   $kalan .= $b_harf[array_search($metin[$m],$b_harf)].''; 
  }else{
   $kalan .= $b_harf[array_search($metin[$m],$k_harf)].'';    
  }
 }
 return $kalan;
}


echo strto("aŞık Veysel derKi");
AŞIK VEYSEL DERKİ


Gelelim nedir bu kodlar, ilk fonsiyonu bende bilmiyorum :D bir yerden aldım preg komutlarını oldum olası yapamam. konuya dönelim ilk fonksiyon metninizin her bir harfini diziye aktarıyor. Bunu yapan başka hazır komutlar da var diyenleri duyar gibiyim ama ne yazikki Türkçe konuşup Türkçe yazmakta ve inanmayacaksınız ama değişkenlerin içlerindeki verilerimiz bile Türkçe. Siz türkçe bir kelimeyi explode veya str_split veya mb_split gibi komutlarla dizi hali getirmeye çalışa dururken burdaki kodları kullanlara yapan arkadaşlar çoktan sorunlarına çözüm buldular bile.

Ne diyorduk, İlk fonksiyonla metninizi dizi haline getirdik harf harf. İkinci fonksiyonda ise Türkçe küçük ve büyük harflerimiz var dizi halinde. Dizi metnimizin her bir harfi tek tek taranıyor ve küçük harflerdeki dizi sırası alınıp, bu dizi sırasına karşılık gelen büyük harflerdeki dizi elemanı alınıp bir değişkene for döngüsündeki sıra ile alınıyor.

Böylelikle harf harf metniniz kontrol edilerek (sadece harfler bir de boşluk var) harfler küçükse büyük harfe çevriliyor.




Bu lanet probleme artık bir dur dediğimize göre işimize geri dönebiliriz.
Yorum Gönder