logo
  • Yazılar
  • Yorumlar
  • Popüler
  • RSS
Son Yazılar
  • RegEx Regular Expressions Düzenli İfadeler 1 ...
  • Wget ile bütün web sayfasını indirmek ...
  • Grep ile belirli bir kelimeyi içeren metin dosyalarını silme ...
Son yorumlar
  • alperen - PHP5 & Google ile 23 dile otomatik …
  • Tümay Çeber - Wget ile bütün web sayfasını in…
  • Ahmet ALP - Wget ile bütün web sayfasını in…
Popüler Yazılar
  • Başka siteden istediğiniz datayı alın (40)
  • Video: Smarty’e Giriş (22)
  • Otomatik Subdomain Yaratma (17)
RSS Beslemeleri
  • RSS
  • Yorumlar RSS
  • Geçerli XHTML

Türkçe upper, lower ve ucwords fonksiyonları (utf-8) (Revize Edilmiştir)

icon1 Posted by Tümay Çeber in Php on 08 27th, 2008 |

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

PLAIN TEXT
PHP:
  1. <?php substr("İstanbul",0,1) == "İ"; ?>

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.

PLAIN TEXT
PHP:
  1. <?php
  2. function tr_ucwords($cumle) {
  3.     $cumle = tr_toLower ( $cumle );
  4.     if (preg_match_all ( '/(?P<i>(?:[ıİğĞüÜşŞöÖçÇ]|[^\s\n]))(?P<k>(?:[ıİğĞüÜşŞöÖçÇ]|[^\s\n]){0,})/siu', $cumle, $sonuc, PREG_PATTERN_ORDER )) {
  5.         $cumle = "";
  6.         foreach ( $sonuc ['i'] as $a => $harf ) {
  7.             $cumle .= tr_toUpper ( $harf ) . $sonuc ['k'] [$a] . " ";
  8.         }
  9.     }
  10.     return $cumle;
  11. }
  12.  
  13. function tr_toUpper($cumle) {
  14.     return strtoupper ( str_replace ( array ('ı', 'i', 'ğ', 'ü', 'ş', 'ö', 'ç' ), array ('I', 'İ', 'Ğ', 'Ü', 'Ş', 'Ö', 'Ç' ), $cumle ) );
  15. }
  16.  
  17. function tr_toLower($cumle) {
  18.     return strtolower ( str_replace ( array ('I', 'İ', 'Ğ', 'Ü', 'Ş', 'Ö', 'Ç' ), array ('ı', 'i', 'ğ', 'ü', 'ş', 'ö', 'ç' ), $cumle ) );
  19. }
  20. ?>

Ö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

PLAIN TEXT
PHP:
  1. <?php header("Content-Type: text/html; charset=utf-8"); ?>

kullanmanız gerekebilir.

PLAIN TEXT
PHP:
  1. <?php
  2. function toUtf8($metin) {
  3.     $metin = str_replace ( array ("&#304;", "\u0130", "\xDD", "İ" ), "İ", $metin );
  4.     $metin = str_replace ( array ("&#305;", "\u0131", "\xFD", "ı" ), "ı", $metin );
  5.     $metin = str_replace ( array ("&#286;", "\u011e", "\xD0", "Ğ" ), "Ğ", $metin );
  6.     $metin = str_replace ( array ("&#287;", "\u011f", "\xF0", "ğ" ), "ğ", $metin );
  7.     $metin = str_replace ( array ("&Uuml;", "\u00dc", "\xDC", "Ü" ), "Ü", $metin );
  8.     $metin = str_replace ( array ("&uuml;", "\u00fc", "\xFC", "ü" ), "ü", $metin );
  9.     $metin = str_replace ( array ("&#350;", "\u015e", "\xDE", "Ş" ), "Ş", $metin );
  10.     $metin = str_replace ( array ("&#351;", "\u015f", "\xFE", "ş" ), "ş", $metin );
  11.     $metin = str_replace ( array ("&Ouml;", "\u00d6", "\xD6", "Ö" ), "Ö", $metin );
  12.     $metin = str_replace ( array ("&ouml;", "\u00f6", "\xF6", "ö" ), "ö", $metin );
  13.     $metin = str_replace ( array ("&Ccedil;", "\u00c7", "\xC7", "Ç" ), "Ç", $metin );
  14.     $metin = str_replace ( array ("&ccedil;", "\u00e7", "\xE7", "ç" ), "ç", $metin );
  15.     return $metin;
  16. }
  17. ?>


Ş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.

PLAIN TEXT
PHP:
  1. <?php
  2. /* tr_ucwords */
  3. $cumle = mb_convert_case ( $cumle, MB_CASE_TITLE, "UTF-8" );
  4. /* tr_toUpper */
  5. $cumle = mb_convert_case ( $cumle, MB_CASE_UPPER, "UTF-8" );
  6. /* tr_toLower */
  7. $cumle = mb_convert_case ( $cumle, MB_CASE_LOWER, "UTF-8" );
  8. ?>

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.

7 Yorum

  1. avatar Uğur Özşahin:
    Eylül 12th, 2008 | 15:08

    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?

  2. avatar Uğur Özşahin:
    Eylül 12th, 2008 | 15:27

    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.

  3. avatar Tümay Çeber:
    Eylül 12th, 2008 | 16:32

    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?

  4. avatar Uğur Özşahin:
    Eylül 12th, 2008 | 21:18

    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.

  5. avatar Uğur Özşahin:
    Eylül 14th, 2008 | 21:22

    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?

  6. avatar Tümay Çeber:
    Eylül 16th, 2008 | 10:57

    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.

  7. avatar Uğur Özşahin:
    Eylül 16th, 2008 | 14:04

    İlgilendiğiniz için teşekkürler…

Yorumla

Uyarı: Yorum onaya tabidir ve bu nede ile eklenmesi zaman alabilir. Tekrar göndermenize gerek yoktur.

Yazarlar

  • Altan Tanrıverdi
  • Paul Bakaus
  • Erhan Burhan
  • Tümay Çeber

Kategoriler

  • jQuery
  • Php
  • Gnu - Linux
  • Json
  • Zend
  • Web 2.0
  • Kılavuzlar
  • Tanıtımlar
  • Konu Dışı
  • İpuçları

Dost Siteler

  • jQuery
  • jQuery Türkiye
  • jQuery UI
  • Ohloh
  • PHP
  • Zend
  • Zend Framework
  • Zend Türkiye
CopyLeft javam. GNU GPL. | Wordpress | Wordpress Türkiye | Lisanslı Tema: Elegant WPT | Sponsor: Türkiye Vitrin