Altan'ın daha önce gönderdiği strtupper ve strtlower için Türkçe probleminin aşılmasına yarayan fonksiyonların encoding problemi ile karşılaştığı durumlar için bir alternatif.
Problemin kaynağı Türkçe karakterlerin 2 byte olmasıdır. Yani
eşitliğini sağlamayacaktır (Bu konuyu uzun uzun açıklamaya gerek görmüyorum artık çoğumuz konuya aşinayız.)
Aşağıdaki kodlar yardımı ile soruna çözüm getirebilirsiniz.
-
<?php
-
function tr_ucwords($cumle) {
-
$cumle = tr_toLower ( $cumle );
-
if (preg_match_all ( '/(?P<i>(?:[ıİğĞüÜşŞöÖçÇ]|[^\s\n]))(?P<k>(?:[ıİğĞüÜşŞöÖçÇ]|[^\s\n]){0,})/siu', $cumle, $sonuc, PREG_PATTERN_ORDER )) {
-
$cumle = "";
-
foreach ( $sonuc ['i'] as $a => $harf ) {
-
$cumle .= tr_toUpper ( $harf ) . $sonuc ['k'] [$a] . " ";
-
}
-
}
-
return $cumle;
-
}
-
-
function tr_toUpper($cumle) {
-
return strtoupper ( str_replace ( array ('ı', 'i', 'ğ', 'ü', 'ş', 'ö', 'ç' ), array ('I', 'İ', 'Ğ', 'Ü', 'Ş', 'Ö', 'Ç' ), $cumle ) );
-
}
-
-
function tr_toLower($cumle) {
-
return strtolower ( str_replace ( array ('I', 'İ', 'Ğ', 'Ü', 'Ş', 'Ö', 'Ç' ), array ('ı', 'i', 'ğ', 'ü', 'ş', 'ö', 'ç' ), $cumle ) );
-
}
-
?>
Önemli not:
Sayfa ve yazılım kodlamasında utf-8 dışında bir kodlama kullanıyorsanız "toUtf8" fonksiyonunu kullanmanızı öneririm.
Ayrıca sayfa başlığı olarak
kullanmanız gerekebilir.
-
<?php
-
function toUtf8($metin) {
-
return $metin;
-
}
-
?>
Şimdi Amerikayı bir kere keşfettiğimize göre işin kolayına kaçma hakkımız var. Php'de alternatifler tükenmez mb_convert_case fonksiyonu "hazırı var" denilmişcesine önümüze sunulmuştur.
-
<?php
-
/* tr_ucwords */
-
/* tr_toUpper */
-
/* tr_toLower */
-
?>
Revize notları:
Uğur Bey'in uyarıları üzerine fark ettim ki "tr_ucwords" fonksiyonunda <i><k> isimlendirme kısımlarını unutmuşum. Bunu düzeltirken ve test ederken html tagları ile sorun yaşadığını fark edip regexe son halini verdim.
Ayrıca "toUtf8" fonksiyonuna eklemeler yapılmıştır.

Merhabalar,
yazmış olduğunuz tr_ucwords fonksiyonunda preg_match_all fonksiyonuna atanan düzenli ifadede bir sıkıntı var sanırım. Şöyle bir hata alıyorum :
Warning: preg_match_all() [function.preg-match-all]: Compilation failed: unrecognized character after (?P at offset 3 in blablabla
hatanın işaret ettiği satır sizin kodlarınızda 4. satır.
Bu hatayı almamak için ne yapabiliriz?
Bu sorunu da şimdi farkettim arka arkaya yorum gönderdiğim için kusura bakmayın.
mb_convert_case fonksiyonları ile türkçe karakterler maalesef yine doğru bir biçimde dönüştürülmüyor.
Bu arada şunuda belirteyim fonksiyonları yerel apache server’da deniyorum.
Uğur bey, sanırım iki probleminizde utf-8 ile alakalı bir problem. Sayfa encoding’i nedir ve “toUtf8″ fonksiyonu ile gelen veriyi filtreleyerek denediniz mi?
Tümay bey merhabalar,
sayfa encoding’ide UTF-8 olarak ayarlı. Birde uygulamamda gelen veri söz konusu değil, şöyle örnek bir kod yazıyorum hemen…
$cumle = “BıraktIm çalışmayI.”;
echo mb_convert_case ( $cumle, MB_CASE_LOWER, “UTF-8″ );
satırlarını çalıştırdığımda sonuç şöyle oluyor
bıraktim çalışmayi.
————————–
Sorunu şöyle özetleyebilirim aslında sadece büyük “I” ve küçük “i” dönüşümlerinde problemler oluyor.
“I” > “i”
“i” < “I” gibi.
preg_match_all() fonksiyonunda aldığım hata ise hala devam etmekte. Düzenli ifadeler konusuna pek hakim olmadığım için burada da sorunu çözebilmiş değilim.
Yeniden merhabalar,
çalışan örnek bir dosyayı herhangi bir yere upload edebilmeniz mümkün mü acaba? Bu sayede nerede yanlışlık olduğunu görebilirim?
Uğur Bey, döküman revize edilmiştir, bu preg_match_all() fonksiyonunda ki problemi çözecektir.
Ayrıca “mb_convert_case” fonksiyonu konusunda haklısınız, böyle bir sorun var araştırmasını yapmaktayım şu anda.
İlgilendiğiniz için teşekkürler…