O webu
Entity

Znakové entity v HTML vznikly nejspíš z toho důvodu, že by bez nich bylo komplikované zapsat znak „menší než“ — „<“, který v HTML slouží k otevření značky, aniž by se tak interpretoval. Jedná se tedy o způsob tzv. escapování.

Typicky entita začíná znakem & (na české klávesnici pravý Alt + C), potom následuje její název a končí středníkem – ;.

Menší než <&lt;

Začátek značky je sice tvořen sekvencí < a alespoň jednoho znaku A–z (na velikosti nezáleží, bez diakritiky, čísel a podobně), takže napsat například a < b by nebyl problém.

V případě „a<b“ bez mezer by se už ale nechtěně vytvořil tučný text – sekvence „<b“ by započala značku <b>.

Kromě toho by bez entit bylo komplikované do textu vypisovat zdrojový HTML kód.

Znak „menší než“ tedy na stránkách nevypisujících HTML kód a nepoužívajících výrazy typu „a<b“ (bez mezer) není potřeba zapisovat pomocí entity. Většinou se tak ale pro pocit bezpečí dělá – entita je to &lt; (z anglického less than).

Větší než >&gt;

I symbol pro konec HTML značky je možné zapsat entitou. Nenapadá mě ale moc situací, kde by mohlo nezaentitování „>“ vadit.

Ani v hodnotě HTML atributu není s > problém, když se použijí uvozovky.

<p title="a>b">
  Odstavec s popiskem „a>b“.
</p>

Ampersand &&amp;

Protože entity začínají ampersandem, stal se & do jisté míry řídicím znakem. Bylo tak najednou nutné vytvořit escape sekvenci i pro ampersand.

Podobně jako <, ani ampersand není většinou nutné zapisovat pomocí entity.

Opět se to ale většinou pro jistotu dělá. Mohlo by se totiž stát že by přímo za & byl obsah, který by tak dohromady dal název existující entity. Pokus o zápis „Vt&gt“ by skončil následovně:

Vt>

Ampersand v odkazech

Trochu reálnější risiko existuje v adresách u odkazů. Bude-li mít stránka URL:

example.com/?a=1&times

A někdo tuto URL zkopíruje do cíle odkazu. Bez převedení & na entitu se &times zobrazí jako křížek × (který se zapisuje entitou &times;) a odkaz nejspíš nebude fungovat.

Předejít tomuto problému může i autor webové aplikace vhodným návrhem parametrů v URL, aby s entitami nekolidovaly.

Uvozovky – &quot;/&apos;

Pro dvojité (") a jednoduché (') uvozovky existují taktéž speciální entity – hodí se k zápisu uvozovek do hodnoty atributů, které bývají v uvozovkách.

Pokud má v atributu title být obsah Text v "uvozovkách", je nutné " převést na entity (nebo pro obalení hodnoty atributu použít uvozovky jednoduché).

<p title="Text v &quot;uvozovkách&quot;">

Jelikož u českých textů bývá zvykem používat „české uvozovky“ (&bdquo; a &ldquo;), hodí se &quot;/&apos; spíš při psaní JavaScriptu do on* atributů (což obecně nebývá moc dobrý nápad) nebo jako automatická ochrana před XSS.

Středník na konci

Entity jsou obvykle k vidění se středníkem na konci. Ani tento středník ale není tak úplně povinný. Některé entity se zobrazí i bez středníku. Dokonce za entitou bez středníku může i normálně pokračovat ®slovo± (výsledek zápisu &regslovo&plusmn).

Vzhledem k editorům barvícím zdrojový kód a obecně přehlednosti to nevypadá jako vhodný postup.

Velikost textu entit

Identifikátory entit jsou většinou závislé na velikosti písma. Některé entity je možné zapsat malými i VELKÝMI písmeny.

VELKÁ: ™, ®, "

malá: ™, ®, "

U entit pro písmena řecké abecedy se na základě velikosti prvního písmena rozlišuje mezi malou a velkou variantou téhož znaku.

Zápis symbolů

Kromě escapovacího významu se entity hodí i k zápisu zvláštních symbolů bez ohledu na kódování. To v dnešní době, kdy jde dobře používat UTF-8 ale není významná výhoda – různé podivné znaky jde rovnou vkládat do HTML kódu.

Jelikož ale může být problematické exotičtější znak umět na klávesnici zapsat, znalost znakových entit se hodí pro urychlení zápisu.

Číselné entity

Kromě entit, které jsou slovně pojmenované, existují ještě tzv. číselné entity. Existují dvojího typu:

  1. Desítkové – &# – číslo – ;
  2. Šestnáctkové – &x – kód – ;

Těmito entitami jdou zapsat úplně všechny znaky.

Číselné entity jde občas použít k obejití různých ochran ve webových aplikacích. Pokud bude například nějaký web v komentářích blokovat řetězec jecas.cz, může k obejití stačit nahradit nějaký znak řetězce entitou.

jec&#97;s.cz

Taktéž se tímto způsobem často podaří obejít minimální limit délky formulářového pole.

Entitou &#8203; se zapisuje tzv. nulová mezera (mezeru s nulovou šířkou). Skutečná délka je potom mnohem vyšší, než vypadá.

Diakritika

Některé WYSIWYG editory mají tendenci znaky s českou diakritikou převádět na entity. Při správně nastaveném kódování to není nutné.

&ecaron; ě
&scaron; š
&ccaron; č
&rcaron; ř
&zcaron; ž
&dcaron; ď
&tcaron; ť
&ncaron; ň
&uacute; ú
&oacute; ó

Používání entit pro diakritiku vytváří nepřehledný zdrojový kód. Převést ho na běžné znaky jde automaticky:

Převod entit v PHP

V jazyce PHP existují pro práci s entitami tři funkce:

  • htmlentities – převede na znakové entity všechny znaky, které převést jde
  • html_entity_decode – převede entity na běžné znaky
  • htmlspecialchars – převede řídicí znaky HTML (<, &, >), s parametrem html_entity_decode i uvozovky (", ')

Odkazy jinam