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.
- Eğer UTF-8′e ihtiyacınız yoksa dosyalarınızı ANSI olarak kaydedin.
- 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.
- 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.