BOM Kötüdür!
resim bulunamadiDün, geliştirmekte olduğumuz bir e-ticaret portalının önyüzünü kodlarken çok garip bir olayla karşılaştık.
Basitleştirilmiş olarak, aşağıdaki gibi bir senaryomuz vardı.

index.php

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>BOM Kötüdür!</title>
    </head>
    <body>
    <?php
        
//tabi ki include_once flan kullanmıyoruz normalde :)
        
include_once("header.html");
        include_once(
"content.html");
    
?>
    </body>
</html>



header.html

<!-- normalde inlince css yazmadığımızı da tahmin etmişsinizdir :) -->
<div style="border:1px solid red">
    Burası ust taraf
</div>



ve content.html

<div style="border:1px dashed #BBB">
    Burasi da icerik
</div>



Buraya kadar her şey normal gibiydi, index.php, iki html dosyasını arka arakaya include edip, aşağıdaki gibi bir kod üretecekti


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>BOM Kötüdür!</title>
    </head>
    <body>
    <div style="border:1px solid red">
Burası ust taraf
</div>
<div style="border:1px dashed #BBB">
    Burasi da icerik
</div>
    </body>
</html>



Ve üretti de. Ama bir sorun vardı; yukarıdaki kod şu şekilde bir çıktı veriyordu
resim bulunamadi


Normalde, üst taraf ve içeriğin alt alta yapışık olması gerekiyordu. Bu boşluklar bizim istemediğimiz bir şeydi.
"Acaba bir yerlerde, padding, margin, float flan mı var?" diye aradık ancak sonuç bulamadık. Kaynak koda da herhangi bir şey görünmüyordu.

Debugger'ımız ile (Bugün Opera dragonfly kullandık ;) baktığımızda da her şey normal gibiydi, ancak şuradaki resimde bir gariplik vardı.
resim bulunamadi


DOM'da bir boşluk vardı! Bu boşluğa sebep olan şeyi aradık bir yarım saat kadar. Daha sonra cat -v ile, herhangi bir "istenmeyen karakter" var mı diye bakayım dedim ve

$ cat -v header.html 
M-oM-;M-?<div style="border:1px solid red">
BurasM-DM-1 ust taraf
</div>

gibi bir sonuç aldım. Dosyaların başında ne olduğunu bilmediğim "M-oM-;M-?" vardı. Biraz araştırdıktan sonra bunun UTF Byte Order Mark (Nam-ı diğer BOM) olduğunu öğrendim. Geliştirici arkadaşlardan birisi, kullandığı editörde, encoding'ini BOM'lu olarak seçmişti. vim kullansalar ":set nobomb" demeleri yetecekti halbuki :p

Bu bize, bir yarım saat kaybettirdi ama bir şey öğrenmiş olduk: "Artık BOM'lu kodlar gönderilemeyecek"

Bir sorun daha vardı ki o da BOM sorunu sadece bu dosyada olmayabilirdi. Proje dizininde, BOM içeren tüm dosyaları bulmalıydık.

Bunun için de biraz bash script yazdım

#dizin icindeki dosyalarda, hexdump yapıp ilk satırında içersinde "ef bb bf" var mı diye bak, olanlari bir dosyaya yaz
for i in `find . -type f`; do cat $i | hd | head -1 | grep -q "ef bb bf" && echo $i; done  > bomlu_dosyalar



Daha sonra da bu bulunan dosyalardan, BOM'u temizleyecek bir başka bash script yazdım

#bomlu dosyalardan, BOM'u kaldir 
IFS=$'n'
for i in `cat bomlu_dosyalar`; do dd if=$i of=$i.temiz ibs=3 skip=1; mv $i.temiz $i; done



Bu da böyle bir anımdır :p

25.Mart.2011 Cuma :: 20:56:45   52627 kere okundu

Konular
Opera {39}
Müzik {70}
Qt {12}
Ben {122}
Debian {26}
Sinema {24}
php/web {44}
Link {58}
KDE {7}

[Konular]


Takvim
<  Eylül 2020  >
PSÇPCCtPz
123456
78910111213
14151617181920
21222324252627
282930


Temalar
xmas
yesilozAskerEdition
yellos
yesiloz
uira
yesilozHtml5
darksight
greeny
opera
default
dx

Es Dost
Altan
Tuğrul
Selçuk
Timu
Mehmet
Ünal
Gökhan
Koray Taylan
Yaşar
Özgür
Orhan
Kemali
Ahmet
Emrah
Kıvanç
BilgiFrekans
Bünyamin
Bedava Site

Gez Gör Arpacık
Opera Türkiye
Uira
Ma"Cess"teleri


Projeler
Beedon
sozluQ
qPod
SourPHP
Ekşigator
Ekşigator-qt
Soccer Madness