Php header() fonksiyonu ve utf-8

Dün akşam PHP’de bir uygulama geliştirmeye çalışırken başıma bir şey geldi. Çözene kadar saatler geçti. Başkasının da başına gelebilir diye buraya yazıyorum.

Türkçe karakter içeren uygulamalar geliştirirken dosylarımı UTF-8 olarak kaydediyorum. Böylece bir sürü yerde Türkçe problemi ile karşılaşmıyorum. Fakat görünen o ki header() fonksiyonu UTF-8′den hiç hoşlanmıyor.

Bildiğiniz gibi header() fonksiyonundan önce betiğiniz hiç bir şekilde başka bir karakter basmamalı. Bu masum bir boşluk bile olabilir. Hatta <?php ?> taglerinden önce bırakılmış bir satır bile “ Warning: Cannot modify header information – headers already sent” tarzında bir hata mesajı almanıza ve istediğiniz headerı gönderememenize yol açar. Çünkü zaten o boşluk web sunucusuna gitmiş ve onun için zaten bir header yaratılmıştır.

Bunu bildiğim ve dikkat ettiğim için uygulamda devamlı bu hatayı alınca yavaş yavaş çıldırmaya başladım. Üstelik hata birinci satırda geliyordu. Yani “<?php” etiketinin olduğu yerde. Tabii hiç bir metin düzenleyici de burada bir karakter görmeyince sinirim artmaya devam etti.

Fakat daha sonra uzun zaman sonunda, ve biraz baş ağrısından sonra farkına vardım ki, bu olay sadece UTF-8 olarak kaydedilen betik dosyalarında başıma geliyor. ANSI olarak kayıt edilenlerde bir problem yok.

Sorun UTF-8 dosyalarının en başında BOM (Byte Order Mark) denilen bikaç karakter olması. Bu karakterler normalde gözükmüyor ama oradalar. Dolayısı ile header() fonksiyonundan önceki çıktı, işte bu BOM’un marifeti.

Bunun önüne geçmek yapabileceğiniz bir iki şey var.

  1. Eğer UTF-8′e ihtiyacınız yoksa dosyalarınızı ANSI olarak kaydedin.
  2. Bazı metin editörleri “UTF-8 without BOM” gibi bir seçenekle gelir. Bunu kullanabilirsiniz. Örneğin bedava bir metin editörü olan Notepad++bunu desktekliyor.
  3. Diğer bir yöntem ise çıktı tamponu (output buffer) ile bu sorunun önüne geçmek. Çıktıyı sunucuya göndermeden önceden header()‘dan önceki karakterleri betik ile kaldırabilirsiniz. (ob_start() fonksiyonun başlangıç için işinize yarabilir)

Umarım yardımı dokunur. Daha iyi bir yöntem varsa bizimle paylaşın.

6 thoughts on “Php header() fonksiyonu ve utf-8

  1. ob_start işe yaramadı. without bom yapınca da upload ettiğim dosya isimlerinde türkçe karakter varsa basmıyor ve xml çıktıları sorunlu oluyor.
    ne yapsak acaba

  2. arkadaşlar cannot modifier hatası genellıkle not defterıne yazdıgınnız durumda ortaya cıkar
    bende bu problemle cok ugrastım ama çözümü basit
    eger not defterınde yazıyorsanız
    utf-8 kulanıyorsanız eger seceneklerde utf-8 without bom varsa seciniz
    çunku bu seceneği seçmediniz diyelım
    utf-8 ıle yazıyosunuz
    bu dosyanın basına ?gibi değişik kelimeler gelıyor ve buda hata vermesıne enden oluyor
    bu karakterlerı not defterınde yazarken gormuyorsunuz ancak dosyaları atın servere ortaya cıkıyor hemen
    tavsıyem notepad++ ıle kodlarınızı yazın
    ordan utf-8 wıthout bom secenegınde kodlarınızı yazın
    ob start en flush gereklı olmuyor o zaman
    iyi kodlamalar

  3. Çokkkkkkkkkkkk teşekkür ederim kafayı yiyecektim.Bilgisayarına virüs kaçmasın :)

  4. ob_start kesinlikle işe yarar fakat bunu en üste baslmalısın ve ayrıca en altınada
    bunu koymalısın hocam bu konuya cevap vermemin nedeni ise senden ALLAH razı olsun benim sorunum bu değildi ama bunun sayesinde birşey anladım bom denen innet yüzünden üste cağırılan sayfalarda bir alt p yada br gibi birşey bırakıyor buda sayfamı bi satır allta kaydırıyordu deli olmuştum tam 12 saat pc başından kalkmadan herşeyi denedim olmadı ama şimdi oldu ALLAH RAZI OLSUN.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>