Розділювальний символ
Розділювальний (відмежовуючий) символ або роздільник (англ. delimiter) — у комп'ютерних мовах називають послідовність із одного або кількох символів, яка служить для означення незалежних фрагментів у текстовому файлі. Найпоширенішим прикладом є знак коми «,» у файлах даних розділених комами.
Альтернативою до вживання розділювальних символів є декларативна нотація, яка використовує довжину фрагменту для визначення його межі.
Усі розділювальні символи можна умовно розділити на 2 великі групи:
- Парні
- Непарні
Парні розділювальні символи
Парні розділювальні символи служать для позначення початку і кінця фрагменту тексту і використовуються тільки парно. Найчастіше вживаються у комп'ютерних мовах, включаючи Wikicode. До цієї групи відносяться різномані види дужок, найпоширеніші такі:
- Круглі дужки ( та )
- Фігурні дужки { та }
- Квадратні дужки [ та ]
- Кутові дужки < та >
- Подвійні лапки " та ", найчастіше служать для позначення рядкових літералів
- Одинарні лапки ' та ', найчастіше служать для позначення рядкових літералів
- <? та ?>, використовуються для позначення інструкцій обробки у мові XML
- /* та */, використовуються для позначення коментарів у багатьох мовах програмування
- {| та |}, використовуються для позначення таблиці у Wikicode
- <% та %>, використовуються у деяких веб-шаблонах, для позначення меж коду, написаного іншою мовою
Непарні розділювальні символи
На відміну від попередньої, символи цієї групи можуть використовуватися, як парно так і поодиноко. Дуже поширеною є практика використання таких символів, у базах даних у файлах даних, для відокремлення даних в середині полів і записів.
Наприклад, у файлах CSV (даних, розділених комами), знак коми «,» служить для розділення полів, а символ закінчення рядка — для розділення записів.
ім'я,прізвище,вік,зарплата Марія,Коваленко,33,30000 Іван,Ковальчук,28,25250 Антон,Ковальський,35,287000
Слід зауважити, що один і той самий символ або послідовність символів, може використовуватись, як для розділення полів, так і для розділення записів.
Файл 1
Марія,Коваленко,33,30000;Іван,Ковальчук,28,25250;Антон,Ковальський,35,287000
У першому файлі символ «;» (крапка з комою) розділяє записи, а у другому «;» розділяє поля
Файл 2
Марія;Коваленко;33;30000/Іван;Ковальчук;28;25250/Антон;Ковальський;35;287000
Проте, якщо це відбувається у межах одного файлу, можливі колізії, див. розділ «Колізії»
Приклади
У популярних операційних системах традиційно використовують такі символи, що розділяють поля та записи:
Кінець поля | Кінець запису | Кінець файлу | |
---|---|---|---|
Unix (та Mac OS X) | Знак табуляції | Знак закінчення рядка | відсутній |
Windows | Знак табуляції | Знак повернення каретки і знак закінчення рядка | відсутній |
Класична Mac OS | Знак табуляції | Знак повернення каретки | відсутній |
У стандарті Unicode символи закінчення поля, запису та файлу кодуються так:
Код | |
---|---|
UNIT SEPARATOR | Position 31 (U+001F) |
RECORD SEPARATOR | Position 30 (U+001E) |
FILE SEPARATOR | Position 28 (U+001C) |
У таблиці нижче подано приклад як розділювальні символи застосовуються у мовах програмування Pascal та C.
Рядковий літерал | Кінець оператора | |
---|---|---|
Pascal | подвійні лапки | крапка з комою |
C | подвійні та одинарні лапки | крапка з комою |
Колізії
Розділювальні символи можуть стати причиною колізій тоді, коли оператор файлу даних (користувач), вставляє розділювальні символи не з метою виділення, фрагментів даних, у текстовому файлі, вставляє їх у неправильній послідовності або вживає символи недопустимі, для даного формату даних. Як приклад розглянемо формат даних розділених комами, найчастіше колізії виникають тоді коли користувач, використовує символ коми «,» як частину даних, наприклад у десяткових дробах (довжина = «3,14»). Як результат дані інтерпретуються неправильно. Оскільки помилки такого типу є дуже поширеними існує кілька шляхів їх подолання.
Escape-символи
Escape-символами (символами відміни) у машинних мовах називаються символи, які ставлять перед службовими символами, сигналізуючи таким чином, що наступна комбінація, інтерпретується не як службовий символ. Наприклад команда
rm *
у мові shell означає видалити усі файли у поточному каталозі, але якщо скористатися символом відміни «\» (escape-символом) то наступна команда означає, видалити усі файли із іменем «*»
rm \*
З аналогічною метою символи відміни вживаються у файлах даних тоді, коли розділювальний символ є частиною самих даних, «скасовуючи» символом відміни його службове значення. Отже, якщо система «знає», що «\» — символ відміни, тоді кома у даних виду (довжина = «3\,14») буде читатися системою, як частина даних, а не як розділювальний символ.
У такого підходу є свої недоліки:
- Текст перенасичений символами відміни, важко сприймається людиною
- Необхідність механізму «відміни символів відміни»
Escape-послідовності
Головною відмінністю escape-послідовностей (послідовностей відміни) від символів відміни є те, що використовується не один а комбінація символів, часто мнемонічна.
Наприклад у мові програмування Perl, використання послідовності «\x34» у наступному виразі
print "Nancy said \x34Hello World!\x34 to the crowd.";
дає такий самий результат як і використання символу відміни «\»
print "Nancy said \"Hello World!\" to the crowd.";
Недоліки цього методу такі самі як у попередньго, а також те що, людина, яка створює файли даних повинна пам'ятати багато таких послідовностей.
Парні розозділювальні символи
Альтернативою до вживання символів та послідовностей відміни є вживання парних розділювальних символів. Найбільш часто використовуються символи одинарних (' та ') та подвійних (" та ") лапок для означення рядкового літералу. Цей підхід застосовується у файлах даних розділених комами
"ширина","довжина" "2,71","3,14"
Непарні розділювальні символи
Використання непарних розділювальних символів, для означення рядкових літералів є гнучкішим засобом для уникнення колізій.
У наступному прикладі в усіх трьох випадких оператор мови Perl qq<розділювальний_символ> <рядковий_літерал> anymore.<розділювальний_символ> дає один і той самий результат
print qq^Nancy doesn't want to say "Hello World!" anymore.^; print qq@Nancy doesn't want to say "Hello World!" anymore.@; print qq§Nancy doesn't want to say "Hello World!" anymore.§;
Хоча такий підхід і дуже гнучкий, однак лише деякі машинні мови його підтримують, наприклад Perl або Ruby.