|
Dü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
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ı.
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 |
57606 kere okundu |
|
|
Takvim |
|
|
< Aralık 2024 > |
P | S | Ç | P | C | Ct | Pz |
| | | | | | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
|
|
|
|
|
|