Byte order mark a PHP
V článku si popíšeme, jak řešit problémy s BOM při práci s hlavičkami v PHP.
18.7.2012 16:00 |
Martin 'Windionleaf' Dočekal
| Články autora
| přečteno 2996×
Komerční sdělení: Pořádáme Kurzy PHP
Ze začátku jenom stručně o samotném BOM a poté následuje návod pro řešení problému s php. Byte order mark (BOM) volně přeloženo jako „označení uspořádání bajtů“. Jedná se o znak, který se používá k rozlišení mezi UTF-16 a UTF-8, také pro rozlišení ukládání bajtů do paměti big-endian / little-endian. Big-endian v tomto případě se uloží nejvíce významný bajt na místo v paměti s nejnižší adresou a poté se ukládají ostatní bajty po nejméně významný bajt. Little-endian je přesný opak. Více o BOM na http://en.wikipedia.org/wiki/Byte_order_mark.
Protože některé aplikace (např. Notepad) užívají tuto značku na začátku souboru (php, html, txt...) pro rozlišení formátu UTF-8, vede to k problémům s odesíláním headerů. Jelikož ne každý používá hexadecimální editor pro psaní v php, tak tuto značku nevidí a při práci s headery vám server, na kterém spustíte script, napíše něco takového: Warning: Cannot modify header information - headers already sent by (output started at /data/web/virtuals/2511/virtual/www/bom.php:1) in /data/web/virtuals/2511/virtual/www/bom.php on line 2.
A teď už konkrétní případ. Uložil jsem soubor bom.php v Notepadu v UTF-8. Jako obsah jsem dal například kód pro přesměrování.
<?
header("HTTP/1.1 301 Moved Permanently");
header("Location: index.php");
header("Connection: close");
?>
Poté jsem jej chtěl spustit a vyhodilo mi to výše zmiňovanou chybu, protože před headery byl již výstup a to právě BOM.
V textovém editoru vypadá script naprosto v pořádku, to je hodně matoucí, a pokud tento problém neznáte tak vás jistě naprosto vyvede z míry.
Ovšem pokud soubor otevřete v hexadecimálním editoru, všimnete si, že je tam něco navíc a objevíte BOM. Odstranit BOM můžete právě pomocí nějakého hexadecimálního editoru například GHex, (Pokud nevlastníte tento druh editoru a víte, že váš problém je BOM, tak řešení pro vás je o pár řádku níže.) Takto to vypadá v GHex.
Vymažete to před < tedy EFBBBF.
Po úpravě:
A teď by to mělo fungovat bez problému.
Hromadné smazání BOM
Pro hromadné smazání se může hodit tento PHP script. Odstraní ze všech souborů v adresáři, kde je uložen tento script, BOM na začátku obsahu, také vypíše všechny soubory php, u kterých nelezl BOM. Na závěr vypíše počet těchto souborů.
<?
$adr = opendir("."); // Otevře momentální adresář.
$num=0; //proměnná pro počítání BOM
while ($file = readdir($adr)){
if(ereg(".*\.php$", $file)){ // Pokud se jedná o soubor php. Chcete-li upravovat i jiné soubory než php, stačí přepsat na tomto řádku php například za txt.
$con =file_get_contents($file); // Obsah souboru php.
if(ereg("^\xEF\xBB\xBF", $con)){ // Na začátku obsahu byl nalezen BOM.
echo "BOM - ";
$num++;
$con=Eregi_Replace("^\xEF\xBB\xBF", "", $con); // Odstranění BOM.
// Přepíše soubor a zavře jej.
$filew = fopen($file, "w");
fwrite($filew, $con);
fclose($filew);
}
echo $file."<br>";
}
}
echo "BOM: ".$num;
?>
Pokud nechcete tento script spouštět přes webový prohlížeč, nebo jej chcete spustit v jiném adresáři než adresáře webového serveru, můžete použít terminál.
Nejprve se musíte dostat do adresáře, ve kterém chcete nechat tento script pracovat, k tomu poslouží příkaz cd.
cd /home/uzivatel/
Tento příkaz vás přenese do adresáře /home/uzivatel/ (místo tohoto adresáře pište váš adresář). Poté spustíte shell:
php -a
A vložíte script bez <? na začátku a ?> na konci. Zadávání ukončíte pomocí CTRL+D, nebo napsáním exit.
Nakonec řešení pro ty, kteří si nechtějí shánět jenom kvůli jednomu souboru (a přitom nechtějí měnit ostatní soubory v adresáři) hexadecimální editor. Je tu pro vás mírně poupravený předchozí script s formulářem pro zadání souboru. Stačí zadat například index.php a BOM bude odstraněn.
<?
if(isset($_POST["jmeno"])){ // Je li POST jmeno odeslán
$file=$_POST["jmeno"]; // Přiřazení proměnné file, poté je script téměř totožný s předchozím
$con =file_get_contents($file);
if(ereg("^\xEF\xBB\xBF", $con)){
echo "BOM - ";
$con=Eregi_Replace("^\xEF\xBB\xBF", "", $con);
$filew = fopen($file, "w");
fwrite($filew, $con);
fclose($filew);
}
echo $file."<br>";
}
?>
<form method='post'>
<input name='jmeno'>
<input type='submit' value='ok'>
</form>
Pochopitelně úplně nejlepší je používat programy pro psaní, které tyto problémy nezpůsobují. Já používám v Ubuntu již základní dobře známý prográmek gedit. Přesto, že nenabízí kdoví jaké vychytávky, tak ho mohu jen doporučit.
Doufám, že tento návod pro odstranění BOM je prospěšný.
Verze pro tisk
| |
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
24.5.2013 6:42 /MaReK Olšavský V rodině Arduina je nový přírůstek, Arduino Yún („Yún“ je čínsky „mrak“). Nové Arduino je nejen první s GNU/Linuxem, ale nabízí i WiFi konektivitu.
Přidat komentář
24.5.2013 6:42 /MaReK Olšavský Na stránkách OMG! Ubuntu! vyšel krátký rozhovor s Markem Shuttleworthem. Tématy jsou Mir, Unity 8, budoucnost Ubuntu Touch, ale neunikl ani otázce na Windows 8.
Přidat komentář
23.5.2013 6:20 /MaReK Olšavský Lektoři, kteří používají e-learning, se již nejspíše setkali s platformou Moodle, jejíž vývojáři vydali verzi 2.5 populární platformy. Vedle několika stovek drobných vylepšení přibyly i novinky v mobilním přístupu, podpora twitterovského Bootstrapu pro témata, nebo instalace pluginů přes administrátorskou část webového rozhraní.
Přidat komentář
23.5.2013 6:20 /MaReK Olšavský Nová distribuce Pidora by měla zajímat Fedoristy, kteří mají Raspberry-Pi, jelikož je optimalizovaným spinem právě pro tuto platformu. Novinky Pidory shrnul Rick Lehrbaum .
Přidat komentář
23.5.2013 6:20 /MaReK Olšavský Krátce po vydání Debianu 7 vyšel i Debian GNU/Hurd 2013. Jádro GNU/Hurd se vyvíjí delší dobu, než Linux, ale zatím je spíše zajímavostí, protože jádro Linux se etablovalo u velkých společností a změna kurzu je více než nepravděpodobná.
Přidat komentář
22.5.2013 6:46 /MaReK Olšavský Svobodný software ve státní sféře nejsou jen vítězství, ale i mýty a pověry, které jej vylučují z výběru. 5 nejčastějších hloupostí o F/L/OSS zkritizoval Adam Firestone na stránkách OpenSource.com. Nesetkáváme se s podobnými argumenty i při snaze prosadit svobodný software ve firmách a u soukromých osob?
Přidat komentář
22.5.2013 6:46 /MaReK Olšavský Embedovatelná databáze SQLite byla vydána ve verzi 3.7.17, která nabízí větší rychlost (v některých úlohách až dvojnásobnou), opravy několika chyb, nebo vylepšení možností nahrávání rozšíření. O SQLite se píše výrazně méně, než o konkurenci, ale velmi pravděpodobně jde o nejčastěji nasazené řešení, díky mnoha aplikacím.
Přidat komentář
22.5.2013 6:45 /MaReK Olšavský 14. května 2013 IBM oznámila konec vývoje Lotus SmartSuite , Lotus Organizer a Lotus 1-2-3, balíků aplikací, jež byly považovány za špičku v oboru. Krátký nekrolog za legendární Lotus 1-2-3, který byl vyvíjen 30 let, sepsal Steven J. Vaughan-Nichols.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
18.5.2013 17:55 /
Martin Kumst Re: zaheslování bash scriptu nebo složky
18.5.2013 7:44 /
--- Re: Prosím o pomoc či radu
15.5.2013 19:21 /
Filip Vaněček Cesty k souborům při používání coolurl
13.5.2013 6:50 /
Radim Kolář Zabbix
8.5.2013 6:07 /
MaReK Olšavský Web Upd8
Více ...
|