Oddělovač

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
Výřez ze souboru ve formátu CSV. Čárky (vyznačené červeně) se používají jako oddělovače polí.

Oddělovač (anglicky delimiter) 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]

Rozdělení oddělovačů[editovat | editovat zdroj]

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ů[editovat | editovat zdroj]

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

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[editovat | editovat zdroj]

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.[4][5]

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

Oddělovače Popis
( a ) Kulaté závorky.
{ a } Složené závorky.[7]
[ a ] Hranaté závorky (často používané pro vyznačení dolního indexu)
< a > Špičaté závorky.[8]
" a " Často používané pro řetězcové literály.[9]
' a ' Často používané pro znakové literály[9].
<? a ?> Používané pro XML nebo SGML instrukce pro zpracování.[10]
/* a */ 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[editovat | editovat zdroj]

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í.

Programovací jazyky

Znakový literál Řetězcový literál Oddělovač příkazů
Pascal apostrof apostrof středník
C apostrof uvozovky středník

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

Konec pole Konec záznamu Konec souboru
Unix, Mac OS X, Amiga OS Tab LF žádný
Windows, MS-DOS, OS/2, CP/M Tab CRLF Control-Z[15]
Classic Mac OS, AppleDOS, ProDOS, GS/OS Tab CR žádný
ASCII/Unicode UNIT SEPARATOR
Pozice 31 (U+001F)
RECORD SEPARATOR
Pozice 30 (U+001E)
FILE SEPARATOR
Pozice 28 (U+001C)

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

Kolize oddělovačů[editovat | editovat zdroj]

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.

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í[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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:

Kód Jméno v Unicode Obvyklé jméno Použití
28 INFORMATION SEPARATOR FOUR Oddělovač souborů (FS) Konec souboru, nebo pro zřetězení dat, která by jinak mohla být zvláštními soubory.
29 INFORMATION SEPARATOR THREE Oddělovač skupin (GS) Mezi části dat. Nejsou potřebné v jednoduchých datových souborech.
30 INFORMATION SEPARATOR TWO Oddělovač záznamů (RS) Konec záznam nebo řádku.
31 INFORMATION SEPARATOR ONE Oddělovač jednotek (US) Mezi poli záznamu nebo prvky na řádku.

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ů[editovat | editovat zdroj]

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ů (anglicky escape 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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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čů[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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]

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.[20][21]

Hranice obsahu[editovat | editovat zdroj]

Hranice obsahu (anglicky content 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í[editovat | editovat zdroj]

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]

Syntaxe regulárních výrazů[editovat | editovat zdroj]

Související informace naleznete také v článku Příklady 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 (anglicky match) 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ě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[editovat | editovat zdroj]

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]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[28].

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Delimiter na anglické Wikipedii.

  1. Federální Standard 1037C - Telekomunikace: Slovníček telekomunikačních termínů
  2. ROHL, Jeffrey S.. Programming in Fortran. Oxford Oxfordshire : Oxford University Press, 1973. ISBN 978-0-7190-0555-8.   Popisuje metodu v Hollerithově notaci v programovacím jazyce Fortran.
  3. a b DE MOOR, Georges J.. Progress in Standardization in Health Care Informatics. [s.l.] : IOS Press, 1993. ISBN 90-5199-114-2.   p. 141
  4. FRIEDL, Jeffrey E. F.. Mastering Regular Expressions: Powerful Techniques for Perl and Other Tools. [s.l.] : O'Reilly, 2002. ISBN 0-596-00289-0.   p. 319
  5. SCOTT, Michael Lee. Programming Language Pragmatics. [s.l.] : Morgan Kaufmann, 1999. ISBN 1-55860-442-1.  
  6. Programming Perl, Third Edition. [s.l.] : O'Reilly. ISBN 0-596-00027-8.  
  7. MEYER, Mark. Explorations in Computer Science. Oxford Oxfordshire : Oxford University Press, 2005. ISBN 978-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ů.
  8. DILLIGAN, Robert. Computing in the Web Age. Oxford Oxfordshire : Oxford University Press, 1998. ISBN 978-0-306-45972-6.  Popisuje syntaxi a oddělovače používané v HTML.
  9. a b SCHWARTZ, Randal. Learning Perl. Oxford Oxfordshire : Oxford University Press, 2005. ISBN 978-0-596-10105-3.  Popisuje řetězcové literály.
  10. WATT, Andrew. Sams Teach Yourself Xml in 10 Minutes. Oxford Oxfordshire : Oxford University Press, 2003. ISBN 978-0-672-32471-0.   Popisuje instrukce pro zpracování XML. p. 21.
  11. CABRERA, Harold. C# for Java Programmers. Oxford Oxfordshire : Oxford University Press, 2002. ISBN 978-1-931836-54-8.   Popisuje jednořádkové a víceřádkové komentáře. p. 72.
  12. Smarty Template Documentation [online]. [cit. 2010-03-12]. Dostupné online.   Viz například, Smarty šablona systém dokumentace, "escaping šablona oddělovače".
  13. KAUFMANN, Matt. Computer-Aided Reasoning: An Approach. [s.l.] : Springer, 2000. ISBN 0-7923-7744-3.  p. 3
  14. Mezinárodní organizace pro normalizaci (1. prosince 1975). "Sada řídicích znaků pro ISO 646". Internet PAssigned Numbers Authority Registry. Alternativní U.S. verze: [1]. Accessed August 7, 2005.
  15. LEWINE, Donald. Posix Programmer's Guide. Oxford Oxfordshire : Oxford University Press, 1991. ISBN 978-0-937175-73-6.   Popisuje použití Ctrl-Z. p. 156,
  16. FRIEDL, Jeffrey. Mastering Regular Expressions. Oxford Oxfordshire : Oxford University Press, 2006. ISBN 978-0-596-52812-6.   popisuje řešení problémů s výskytem oddělovačů v datech. p. 472.
  17. Discussion on ASCII Delimited Text vs CSV a Tab Delimited
  18. KAHREL, Peter. Automating InDesign with Regular Expressions. [s.l.] : O'Reilly, 2006. ISBN 0-596-52937-6.  p. 11
  19. Programming Perl, Third Edition. [s.l.] : O'Reilly. ISBN 0-596-00027-8.   p. 63.
  20. Programming Perl, Third Edition. [s.l.] : O'Reilly. ISBN 0-596-00027-8.   p. 62
  21. YUKIHIRO, Matsumoto. Ruby in a Nutshell. [s.l.] : O'Reilly, 2001. ISBN 0-596-00214-9.   V Ruby se používá název řetězce s obecným oddělovačem. p. 11
  22. JAVVIN TECHNOLOGIES, Incorporated. Network Protocols Handbook. [s.l.] : Javvin Technologies Inc., 2005. ISBN 0-9740945-2-8.   p. 26
  23. 200, Cicling. Computational Linguistics and Intelligent Text Processing. Oxford Oxfordshire : Oxford University Press, 2001. ISBN 978-3-540-41687-6.   Popisuje oddělovače tvořené bílými znaky. p. 258.
  24. FRIEDL, Jeffrey. Mastering Regular Expressions. Oxford Oxfordshire : Oxford University Press, 2006. ISBN 978-0-596-52812-6.   stránka 472.
  25. Perl operátory a precedence
  26. RHEE, Man. Internet Security: Cryptographic Principles, Algorithms and Protocols. [s.l.] : John Wiley a Sons, 2003. ISBN 0-470-85285-2.  (příklad použití ASCII armoringu při šifrování)
  27. GROSS, Christian. Open Source for Windows Administrators. [s.l.] : Charles River Media, 2005. ISBN 1-58450-347-5.  (příklad použití ASCII armoringu při šifrování)
  28. a b KALANI, Amit. Developing and Implementing Web Applications with Visual C# . NET and Visual Studio . NET. [s.l.] : Que, 2004. ISBN 0-7897-2901-6.  (popisuje použití kódování Base64 a VIEWSTATE ve zdrojovém kódu HTML)

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]