Čím sa líši UTF-8 od UTF-8 bez BOM? Ktorý je lepší?
UTF-8 BOM je postupnosť bajtov na začiatku textového toku (EF BB BF), ktorá umožňuje čítačke spoľahlivejšie odhadnúť, či je súbor kódovaný v UTF-8.
Za normálnych okolností sa BOM používa na signalizáciu endianity kódovania, ale keďže endianita je pre UTF-8 irelevantná, BOM nie je potrebný.
Podľa normy Unicode sa BOM pre súbory UTF-8 neodporúča:
2.6 Schémy kódovania
... Použitie BOM sa pre UTF-8 nevyžaduje ani neodporúča, ale môže byť vyskytnúť v kontextoch, keď sa údaje UTF-8 konvertujú z iných foriem kódovania, ktoré používajú BOM, alebo keď sa BOM používa ako UTF-8 podpis. Pozri podkapitolu "Značka poradia bajtov" v oddiele 16.8, Špeciálne znaky, pre viac informácií.
UTF-8 bez BOM nemá BOM, čo ho nerobí lepším ako UTF-8 s BOM, okrem prípadov, keď spotrebiteľ súboru potrebuje vedieť (alebo by mal prospech z toho, keby vedel), či je súbor kódovaný v UTF-8 alebo nie.
BOM je zvyčajne užitočný na určenie endianity kódovania, čo sa vo väčšine prípadov použitia nevyžaduje.
Okrem toho môže byť BOM zbytočným šumom/námahou pre tých spotrebiteľov, ktorí ho nepoznajú alebo sa oň nezaujímajú, a môže viesť k zmätku používateľa.
Z adresy http://en.wikipedia.org/wiki/Byte-order_mark:
Značka poradia bajtov (BOM) je znak Unicode znak používaný na signalizáciu endianitu (poradie bajtov) textového súboru alebo toku. Jej kódový bod je U+FEFF. Použitie BOM je nepovinné, a ak sa použije, by sa mal objaviť na začiatku textu toku. Okrem špecifického použitia ako indikátor poradia bajtov, BOM znak môže tiež indikovať, ktorý z niekoľkých reprezentácií Unicode je text zakódovaný.
Vždy používajte BOM vo svojom súbore, čím zabezpečíte, že sa vždy správne otvorí v editore, ktorý podporuje UTF-8 a BOM.
Môj skutočný problém s absenciou BOM je nasledujúci. Predpokladajme, že máme súbor, ktorý obsahuje:
abc
Bez BOM sa vo väčšine editorov otvorí ako ANSI. Takže iný používateľ tento súbor otvorí a pridá do neho niektoré natívne znaky, napr:
abg-αβγ
Ups... Teraz je súbor stále v ANSI a hádajte čo, "αβγ" nezaberá 6 bajtov, ale 3. To nie je UTF-8 a spôsobuje to ďalšie problémy neskôr vo vývojovom reťazci.