Oddělovač
Oddělovač () nebo separátor je znak nebo posloupnost znaků sloužící pro zadání hranice mezi zvláštními, nezávislými oblastmi v prostém textu nebo v jiných datových proudech. Příkladem oddělovače je znak čárka, který se používá jako oddělovač polí ve formátu CSV (hodnoty oddělené čárkami). Jiným příkladem oddělovače je časová prodleva používaná pro oddělování písmen a slov v Morseově abecedě.

Oddělovače jsou jedním z mnoha prostředků pro zadání hranic v datovém proudu. Jinou metodou je deklarativní notace, ve které je na začátku datového proudu uvedeno, kolik znaků proud obsahuje.

Rozdělení oddělovačů 
Oddělovače lze rozdělit na:

 oddělovače polí a záznamů
 párové (závorkové) oddělovače

Oddělovače polí a záznamů 
Oddělovače polí oddělují jednotlivá datová pole; oddělovače záznamů oddělují skupiny polí.

Například formát CSV používá čárky jako oddělovače polí a znaky konce řádku jako oddělovače mezi záznamy. Například:
jméno,příjmení,věk,plat
nancy,davolio,33,$30000
erin,borakova,28,$25250
tony,raphael,35,$28700
je jednoduchá tabulka ve formátu CSV v databázi tvořené obyčejnými soubory.

Párové oddělovače 
Párové oddělovače (také závorkové oddělovače, blokové oddělovače nebo oddělovače oblastí) označují začátek i konec oblasti textu.

Mezi závorkové oddělovače patří:

Pro vyznačení pořadí vyhodnocování se v počítačových jazycích používají na rozdíl od matematiky pouze kulaté závorky. Programovací jazyk Lisp se vyznačuje používáním velkého množství závorek.

Konvence 
Používání určitých oddělovačů na počítačových platformách je dáno konvencí. Následující tabulky ukazují pouze několik příkladů pro porovnání.

Programovací jazyky

Oddělovače záznamů a polí

Viz též ASCII, řídicí znak.

Kolize oddělovačů 

Pokud samotná data obsahují znaky nebo posloupnosti používané jako oddělovače, dochází k jevu nazývanému kolize oddělovačů. U XML, HTML a SGML může dojít ke kolizi oddělovačů, pokud text obsahuje znaky špičaté závorky. U většiny typů souborů existují jak oddělovače polí tak oddělovače záznamů, a obojí může způsobit kolizi. V případě CSV souborů dojde ke kolizi, pokud položka obsahuje čárku (například mzda = "$30,000"), a ke kolizi oddělovačů záznamů dojde, pokud nějaké pole obsahuje více řádků. Kolize oddělovačů záznamů i polí se často objevuje v textových souborech.

Kolize oddělovačů mohou způsobit zranitelnost systémů, protože mohou být zneužity k exploitům. Zneužití kolizí oddělovačů v jazycích SQL a HTML jsou známy jako útoky SQL injection nebo cross-site scripting.

Řešení 
Protože kolize oddělovačů představují závažný problém, byly vyvinuty různé metody, jak jim zabránit. Někteří autoři se snaží vybírat oddělovače, které se v datovém proudu samotném nemohou objevit. Použití tohoto ad hoc přístupu nenabízí žádnou bezpečnost proti úmyslným kolizím. Proto se používají formal konvence jsou proto použitý také.

ASCII delimited text 
Znakové sady ASCII a Unicode obsahují netisknutelné znaky s kódy 28 až 31, které jsou určeny pro použití jako oddělovače:

Použití znaku ASCII 31 Oddělovač jednotek jako oddělovače polí a ASCII 30 Oddělovač záznamů řeší problém oddělovačů polí i záznamů, které se vyskytují v textových datových proudech.

Použití únikových znaků 

Jednou z metod pro zamezení kolizím oddělovačů je používání únikových znaků (). Používání escape znaků je dostačující z perspektivy návrhu jazyka, ale přinášejí různé nevýhody:

 text plný escape znaků je těžko čitelný, problém označovaný  jako  (kvůli používání znaku \ pro escape / v regulárních výrazech v Perlu, což vede k posloupnostem jako je "\/\/");
 text je obtížně analyzovatelný pomocí regulárních výrazů
 je třeba mechanismus pro „escapování escape znaků“, které nemají sloužit jako únikové znaky
 přestože je lze snadno zapsat, mohou být nesrozumitelné pro osoby neobeznámené s jazykem.
 nechrání před code injection útoky

Escape posloupnosti 
Escape posloupnosti jsou podobné escape znakům, ale obvykle nejsou tvořeny jediným znakem, ale nějakou mnemonickou posloupností. Jedno použití je v řetězcových literálech, které zahrnuje znak uvozovky ("). Například následující kód v jazyce Perl:

print "Nancy zvolala \x22Ahoj!\x22 do davu."; ### použití \x22

produkuje stejný výstup jako:

print "Nancy zvolala \"Ahoj!\" do davu."; ### použití escape znaku

Nevýhodou escape posloupností je, že pokud je používají lidé, musí si pamatovat kódy, které reprezentují jednotlivé znaky (viz také: HTML entita, numerický znak reference).

Dvojí uvozovky 
V porovnání s escape posloupnostmi a escape znaky poskytuje dvojí uvozovky ještě další způsob, aby se zabránilo kolizi oddělovačů. Příkladem jsou jazyky, které umožňují jako omezovač řetězců používat jednoduchý apostrof (') i dvojité uvozovky ("). Například v jazyce Perl:

print 'Nancy zvolala "Ahoj!" do davu.';

produkuje požadovaný výstup bez potřeby použít escape znaky. Tento přístup však funguje pouze tehdy, když řetězec neobsahuje oba typy uvozovek.

Zdvojování párových oddělovačů 
Zdvojování párových oddělovačů uvnitř řetězců nebo jiných výrazů je alternativním postupem k používání escape posloupností a escape znaků pro zabránění kolizím oddělovačů. Visual Basic například používá dvojité uvozovky jako oddělovače. Toto je podobný escaping oddělovač.

print "Nancy zvolala ""Ahoj!"" do davu."

produkuje požadovaný výstup bez nutnosti používat escape znaky. Stejně jako normální escaping může být matoucí, pokud je potřeba použít příliš mnoho uvozovek.
Kód pro výpis výše uvedeného zdrojového kódu by mohl být ještě více matoucí:

print "print ""Nancy zvolala """"Ahoj!"""" do davu."""

Vícero uvozovek 
V porovnání s dvojími uvozovkami je větší počet uvozovek ještě flexibilnější a tak lze ještě lépe zabránit kolizi oddělovačů.

Následující příkazy v jazyce Perl:

 print qq^Jan by moh' říct "Ahoj!".^;
 print qq@Jan by moh' říct "Ahoj!".@;
 print qq(Jan by moh' říct "Ahoj!".);

produkují požadovaný výstup díky použití quote operátorů, které umožňují, aby libovolný zvolený znak fungoval jako oddělovač. I když je tato metoda flexibilnější, podporuje ji poměrně málo jazyků, mezi něž patří Perl a Ruby.

Hranice obsahu 
Hranice obsahu () je speciálním typem oddělovače, který je navržen tak, aby nezpůsoboval kolize oddělovačů. Umožňuje zadat libovolnou posloupnost znaků, která vždy indikuje hranice mezi částmi vícedílné zprávy, a neumožňuje žádnou jinou interpretaci.

Oddělovač často obsahuje náhodnou posloupnost znaků, tak dlouhou, že je statisticky nepravděpodobné, aby se objevila v datech. Může obsahovat další identifikaci jako UUID, časové razítko nebo jiný rozlišovač. Data, do kterých se vkládá oddělovač mohou být zkontrolována, aby se zajistilo, že oddělovače se náhodou nevyskytují v textu. To umožňuje používat kratší nebo jednodušší oddělovače a zvyšuje čitelnost dokumentu pro člověka. (Viz například, MIME, here-dokument).

Bílé znaky nebo odsazení 
Některé programovací a počítačové jazyky používají oddělovače tvořené bílými znaky nebo odsazováním jako prostředek popisující hranice mezi nezávislými oblastmi textu.

Syntaxe regulárních výrazů 

Pro popis regulárních výrazů bývá možné používat alternativní oddělovače, které zjednodušují zápis operace srovnání nebo napasování regulárního výrazu na řetězec () a substituci v jazyce Perl.

Například jednoduché napasování řetězce na regulární výraz lze v Perlu zadat následujícím způsobem:

$string1 = 'Nancy zvolala „Ahoj!“ do davu.'; # definuje cílový řetězec
print $string1 =~ m/[aeiou]+/; # vyhovuje jedna nebo více samohlásek

Perl umožňuje používat alternativní oddělovače, což přináší dostatečnou flexibilitu, aby se zabránilo kolizi oddělovačů:

$string1 = 'Nancy zvolala "http://Hello/World.htm" není povolená adresa.'; # cílový řetězec

print $string1 =~ m@http://@; # napasování pomocí alternativního oddělovače regulárního výrazu
print $string1 =~ m{http://}; # totéž jako předchozí, ale jiný oddělovač
print $string1 =~ m!http://!; # totéž jako předchozí, ale jiný oddělovač.

Here-dokument 
Here-dokument umožňuje vložení libovolného obsahu definováním speciálního konce posloupnost. Tuto metodu podporuje mnoho jazyků včetně PHP, bash skripty, Ruby a Perl. Here-dokument začíná popisem, jaká posloupnost jej bude ukončovat a pokračuje, dokud se zadaná posloupnost neobjeví na začátku nového řádku.

Příklad v jazyce Perl:

print <<ENDOFHEREDOC;
Zapsat řetězec obsahující "určité znaky" je obtížné.

Znaky konce řádku, čárky a jiné znaky mohou způsobit kolizi oddělovačů.
ENDOFHEREDOC

Tento kód vytiskne:
Zapsat řetězec obsahující "určité znaky" je obtížné.

Znaky konce řádku, čárky a jiné znaky mohou způsobit kolizi oddělovačů.

Díky použití speciálního konce posloupnosti se mohou v řetězci objevit všechny uvedené znaky.

ASCII armor 
ASCII armoring se obvykle používá jako mechanismus pro textové kódování binárních dat. Jedná se techniku programování a správy systémů, která může v některé případech také zabránit kolizi oddělovačů. Tato technika je odlišena od jiných zde popsaných metod, protože je složitější a proto není vhodná pro malé aplikace a jednoduché formáty pro ukládání dat. Technika využívá speciální kódovací schéma, jako například base64, pro zajištění, že se oddělovač znaků neobjeví ve vysílaných datech.

Tato technika se používá například ve vývojových technologiích ASP.NET pro WWW firmy Microsoft a je těsně spojená s komponentou „VIEWSTATE“ tohoto systém.

Příklad 
Následující zjednodušený příklad ukazuje, jak tato technika funguje v praxi.

První fragment kódu ukazuje jednoduchý HTML prvek, ve kterém hodnota VIEWSTATE obsahuje znaky, které jsou nekompatibilní s oddělovači HTML tagů:

<input type="hidden" name="__VIEWSTATE" value="BookTitle:Nancy doesn't say "Ahoj!" anymore." />

Tento první fragment kódu není dobře utvořeným prvkem, a proto při nasazení v „reálném světě“ nebude správně fungovat.

Druhý fragment kódu ukazuje stejný HTML tag, ve kterém jsou nekompatibilní znaky v hodnotě VIEWSTATE odstraněny použitím kódování Base64:

<input type="hidden" name="__VIEWSTATE" value="Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu" />

Třetí fragment kódu ukazuje stejný HTML tag, kde jsou nekompatibilní znaky v hodnotě VIEWSTATE odstraněny pomocí URL kódování (používající znak procento a kód požadovaného znaku):

<input type="hidden" name="__VIEWSTATE" value="BookTitle:Nancy%20doesn%27t%20say%20%22Hello%20World!%22%20anymore." />

Toto řešení zabrání kolizi oddělovačů a zaručuje, že se nekompatibilní znaky nebudou vyskytovat v HTML kódu, bez ohledu na to, jaké znaky byly v původním (dekódovaném) textu.

Odkazy

Reference

Související články 
 Escapování
 Escape sekvence
 CSV
 Řetězcový literál
 Desetinná čárka

Externí odkazy 
 
 Data File Metaformats z knihy „The Art of Unix Programming“ od Erica Stevena Raymonda
 What is delimiter od Margaret Rouse.

Značkovací jazyky
Programovací konstrukce