Oddělovač (anglickydelimiter) 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.[1] 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.[2]
Používané v některých programovacích jazycích pro komentáře.[11]
<% a %>
Používané v některých WWW šablonách pro zadání hranic jazyků. Jsou také nazývány šablonové oddělovače.[12]
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.
[13]
Konvence
Používání určitých oddělovačů na počítačových platformách je dáno konvencí.[14] Následující tabulky ukazují pouze několik příkladů pro porovnání.
Pokud samotná data obsahují znaky nebo posloupnosti používané jako oddělovače, dochází k jevu nazývanému kolize oddělovačů[3].[16] 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.
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.[17]
Použití únikových znaků
Podrobnější informace naleznete v článku Escapování.
Jednou z metod pro zamezení kolizím oddělovačů je používání únikových znaků (anglickyescape character). 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ý anglicky jako leaning toothpick syndrome (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.[18]
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čů.[19]
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.[20][21]
Hranice obsahu
Hranice obsahu (anglickycontent boundary) 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.[22]
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.[23]
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 (anglickymatch) a substituci v jazyce Perl.[24]
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ězecprint$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ězecprint$string1=~m@http://@;# napasování pomocí alternativního oddělovače regulárního výrazuprint$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.[25]
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čů.[26][27] 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.[28]
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ů:
<inputtype="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:
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):
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[28].
Odkazy
Reference
V tomto článku byl použit překlad textu z článku Delimiter na anglické Wikipedii.
↑ Federální Standard 1037C - Telekomunikace: Slovníček telekomunikačních termínů. www.its.bldrdoc.gov [online]. [cit. 2015-11-04]. Dostupné v archivu pořízeném dne 2013-03-05.
↑ROHL, Jeffrey S. Programming in Fortran. Oxford Oxfordshire: Oxford University Press, 1973. Dostupné online. ISBN978-0-7190-0555-8. Popisuje metodu v Hollerithově notaci v programovacím jazyce Fortran.
↑ abDE MOOR, Georges J. Progress in Standardization in Health Care Informatics. [s.l.]: IOS Press, 1993. ISBN90-5199-114-2. p. 141
↑FRIEDL, Jeffrey E. F. Mastering Regular Expressions: Powerful Techniques for Perl and Other Tools. [s.l.]: O'Reilly, 2002. Dostupné online. ISBN0-596-00289-0. p. 319
↑SCOTT, Michael Lee. Programming Language Pragmatics. [s.l.]: Morgan Kaufmann, 1999. ISBN1-55860-442-1.
↑MEYER, Mark. Explorations in Computer Science. Oxford Oxfordshire: Oxford University Press, 2005. ISBN978-0-7637-3832-7. definuje programovací jazyky vycházející z jazyka C, které používají složené závorky a středníky pro oddělování příkazů.
↑DILLIGAN, Robert. Computing in the Web Age. Oxford Oxfordshire: Oxford University Press, 1998. ISBN978-0-306-45972-6.Popisuje syntaxi a oddělovače používané v HTML.
↑WATT, Andrew. Sams Teach Yourself Xml in 10 Minutes. Oxford Oxfordshire: Oxford University Press, 2003. Dostupné online. ISBN978-0-672-32471-0. Popisuje instrukce pro zpracování XML. p. 21.
↑CABRERA, Harold. C# for Java Programmers. Oxford Oxfordshire: Oxford University Press, 2002. ISBN978-1-931836-54-8. Popisuje jednořádkové a víceřádkové komentáře. p. 72.
↑Smarty Template Documentation [online]. [cit. 2010-03-12]. Dostupné online. Viz například, Smarty šablona systém dokumentace, "escaping šablona oddělovače".
↑LEWINE, Donald. Posix Programmer's Guide. Oxford Oxfordshire: Oxford University Press, 1991. Dostupné online. ISBN978-0-937175-73-6. Popisuje použití Ctrl-Z. p. 156,
↑FRIEDL, Jeffrey. Mastering Regular Expressions. Oxford Oxfordshire: Oxford University Press, 2006. ISBN978-0-596-52812-6. popisuje řešení problémů s výskytem oddělovačů v datech. p. 472.
↑YUKIHIRO, Matsumoto. Ruby in a Nutshell. [s.l.]: O'Reilly, 2001. Dostupné online. ISBN0-596-00214-9. V Ruby se používá název řetězce s obecným oddělovačem. p. 11
↑200, Cicling. Computational Linguistics and Intelligent Text Processing. Oxford Oxfordshire: Oxford University Press, 2001. Dostupné online. ISBN978-3-540-41687-6. Popisuje oddělovače tvořené bílými znaky. p. 258.
↑RHEE, Man. Internet Security: Cryptographic Principles, Algorithms and Protocols. [s.l.]: John Wiley a Sons, 2003. Dostupné online. ISBN0-470-85285-2.(příklad použití ASCII armoringu při šifrování)
↑GROSS, Christian. Open Source for Windows Administrators. [s.l.]: Charles River Media, 2005. Dostupné online. ISBN1-58450-347-5.(příklad použití ASCII armoringu při šifrování)
↑ abKALANI, Amit. Developing and Implementing Web Applications with Visual C# . NET and Visual Studio . NET. [s.l.]: Que, 2004. ISBN0-7897-2901-6.(popisuje použití kódování Base64 a VIEWSTATE ve zdrojovém kódu HTML)