UTF FIX BOM

Některé editory vkládají na začátek souboru tzv. BOM (Byte Order Mark). Kvůli BOM může zařvat zaslání hlavičky a přesto, že jste si jisti, že nikde ve skriptu nic dříve na výstup nejde před zasláním header(), přece tam někdě něco neviditelného je. A jak se toho zbavit?


Zdrojový kód ke stažení bom.php.txt

BOM (Byte Order Mark) se používá k určení o jaké UTF kódování se v souboru jedná, zda je použito UTF-8, UTF-16, UTF-32 a další.

V praxi obvykle při psaní skriptů BOM potřebovat nebudeme, potřeboval jsem to snad jen jednou a to pro Fussion Chart grafy definované xml souborem (ten musel začínat BOM znaky).

Otestovat jeslti v souboru je BOM můžeme snadno:

  1. $bom = fread($file, 3);
  2. if ($bom == ( chr(0xEF) . chr(0xBB) . chr(0xBF) )) {
  3. je tam!

V příkladech ke stažení pak najdete skript, který když umístíte nad všechny soubory, které chcete zkontrolovat a spustíte ho, tak projde rekurzivně jeden soubor za druhým (včetně podadresářů) a když zjistí, že je v souboru BOM, tak soubor uloží znovu, ale bez BOM.

Názvy souborů, které obsahovaly BOM vypíše na obrazovku. Pozor pokud je opravdu nějaký důvod k BOM tak tato operace je nevratně odstraní!

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
19.05.2010 11:40 | Anonym (msx) | Poriadny editor

Poriadny editor má možnosť túto UTF hlavičku vypnúť. Štandardne je myslím zvyčajne vypnutá a dobrý editor si kódovanie súboru vie detekovať ako napr. PSPad. A pokiaľ sa dobre pamätám, UTF hlavička má len 2 B, nie 3.

21.05.2010 11:43 | Administrátor | Re: Poriadny editor

netbeans bohužel nemá :( nebo jsem to alespoň nenašel

a detekovat kódování co vím, také neumí, detekuje na základě kódování projektu

jinak jde o to, odhalit tuto hlavičku v sadě stovek souborů, což by s editorem mohl být trochu problém

2B vs. 3B zkusme třeba wikipedii

http://en.wikipedia.org/…e_order_mark#…

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>