Разделитель
Разделитель — это последовательность из одного или нескольких символов для указания границы между отдельными независимыми областями в виде обычного текста , математических выражений или других потоков данных . [1] [2] Примером разделителя является символ запятой , который действует как разделитель полей в последовательности значений, разделенных запятыми . Другим примером разделителя является временной интервал, используемый для разделения букв и слов при передаче кода Морзе . [ нужна ссылка ]
В математике разделители часто используются для указания области действия и могут встречаться как в виде изолированных символов (например, двоеточие в " ") и в виде пары противоположных символов (например, угловых скобок в ).
Разделители представляют собой один из различных способов указания границ в потоке данных . Например, декларативная нотация — это альтернативный метод (без использования разделителей), который использует поле длины в начале потока данных для указания количества символов, содержащихся в потоке данных. [3]
Обзор
[ редактировать ]Разделители могут характеризоваться как разделители полей и записей или как разделители скобок.
Разделители полей и записей
[ редактировать ]Разделители полей разделяют поля данных. Разделители записей разделяют группы полей. [4]
Например, в формате CSV используется запятая в качестве разделителя между полями , а — индикатор конца строки в качестве разделителя между записями :
fname,lname,age,salary nancy,davolio,33,$30000 erin,borakova,28,$25250 tony,raphael,35,$28700
Это определяет простую базы данных в виде плоского файла, таблицу использующую формат файла CSV.
Разделители в скобках
[ редактировать ]Разделители в скобках, также называемые разделителями блоков, разделителями регионов или сбалансированными разделителями, отмечают начало и конец области текста. [5] [6]
Общие примеры разделителей скобок включают в себя: [7]
Разделители | Описание |
---|---|
( )
|
Круглые скобки . Синтаксис языка программирования Лисп считается узнаваемым, прежде всего, благодаря использованию круглых скобок. [8] |
{ }
|
Фигурные скобки (также называемые фигурными скобками) . [9] ). |
[ ]
|
Скобки (обычно используются для обозначения нижнего индекса). |
< >
|
Угловые кронштейны . [10] |
" "
|
обычно используется для обозначения строковых литералов . [11] |
' '
|
обычно используется для обозначения символьных литералов . [11] |
<? ?>
|
используется для обозначения инструкций обработки XML . [12] |
/* */
|
используется для обозначения комментариев в некоторых языках программирования. [13] |
<% %>
|
используется в некоторых веб-шаблонах для указания языковых границ. [14] |
Конвенции
[ редактировать ]Исторически сложилось так, что компьютерные платформы по соглашению использовали определенные разделители. [15] [16] В следующих таблицах приведены несколько примеров для сравнения.
Языки программирования ( См. также , Сравнение языков программирования (синтаксис) ).
Строковый литерал | Конец заявления | |
---|---|---|
Паскаль | одинарная кавычка | точка с запятой |
Питон | двойная кавычка, одинарная кавычка | конец строки (EOL) |
Разделители полей и записей ( см . также ASCII , Управляющий символ ).
Конец поля | Конец записи | Конец файла | |
---|---|---|---|
Unix-подобные системы, включая macOS , AmigaOS | Вкладка | НЧ | никто |
Windows , MS-DOS , OS/2 , CP/M | Вкладка | CRLF | нет (кроме CP/M), Control-Z [17] |
Классическая Mac OS , Apple DOS , ProDOS , GS/OS | Вкладка | ЧР | никто |
ASCII/Юникод | СЕПАРАТОР ЕДИНИЦЫ Позиция 31 (U+001F) |
РАЗДЕЛИТЕЛЬ ЗАПИСЕЙ Позиция 30 (U+001E) |
РАЗДЕЛИТЕЛЬ ФАЙЛОВ Позиция 28 (U+001C) |
Столкновение разделителей
[ редактировать ]Столкновение разделителей — это проблема, которая возникает, когда автор или программист вводит разделители в текст, фактически не намереваясь интерпретировать их как границы между отдельными областями. [4] [18] Например, в случае XML это может произойти всякий раз, когда автор пытается указать символ угловой скобки .
В большинстве типов файлов есть как разделитель полей, так и разделитель записей, оба из которых могут конфликтовать. Например , в случае файлов со значениями, разделенными запятыми , коллизия полей может возникнуть всякий раз, когда автор пытается включить запятую как часть значения поля (например, зарплата = «30 000 долларов США»), а коллизия разделителей записей может возникать всякий раз, когда поле содержал несколько строк. В текстовых файлах часто возникают конфликты между записями и разделителями полей.
В некоторых случаях злонамеренный пользователь или злоумышленник может намеренно попытаться воспользоваться этой проблемой. Следовательно, конфликт разделителей может быть источником уязвимостей и эксплойтов безопасности . Злоумышленники могут воспользоваться конфликтом разделителей в таких языках, как SQL и HTML, для развертывания таких известных атак, как SQL-инъекция и межсайтовый скриптинг соответственно.
Решения
[ редактировать ]Поскольку столкновение разделителей является очень распространенной проблемой, были изобретены различные методы ее решения. Некоторые авторы могут попытаться избежать этой проблемы, выбрав символ-разделитель (или последовательность символов), который вряд ли появится в самом потоке данных. Этот специальный подход может быть подходящим, но он обязательно зависит от правильного предположения о том, что появится в потоке данных, и не обеспечивает защиты от злонамеренных коллизий. Поэтому применяются и другие, более формальные соглашения.
Текст с разделителями ASCII
[ редактировать ]Наборы символов ASCII и Unicode были разработаны для решения этой проблемы путем предоставления непечатаемых символов, которые можно использовать в качестве разделителей. Это диапазон от ASCII 28 до 31.
ASCII декабрь | Символ | Имя в Юникоде | Общее имя | Использование |
---|---|---|---|---|
28 | ␜ | ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ЧЕТВЕРТЫЙ | разделитель файлов | Конец файла. Или между объединением того, что в противном случае могло бы быть отдельными файлами. |
29 | ␝ | ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ТРИ | разделитель групп | Между разделами данных. Не требуется в простых файлах данных. |
30 | ␞ | ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ВТОРОЙ | разделитель записей | Конец записи или строки. |
31 | ␟ | ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ОДИН | разделитель единиц измерения | Между полями записи или членами строки. |
Использование разделителя единиц ASCII 31 в качестве разделителя полей и разделителя записей ASCII 30 решает проблему разделителей как полей, так и записей, которые появляются в потоке текстовых данных. [19]
Побег персонаж
[ редактировать ]Одним из способов избежать столкновения разделителей является использование escape-символов . С точки зрения языкового дизайна они адекватны, но у них есть недостатки:
- текст может стать нечитаемым, если он засорен многочисленными escape-символами, эта проблема называется синдромом наклоненной зубочистки (из-за использования \ для экранирования / в Perl регулярных выражениях , что приводит к таким последовательностям, как "\/\/");
- текст становится трудно анализировать с помощью регулярных выражений
- им требуется механизм «ухода от escape-символов», если они не предназначены для использования в качестве escape-символов; и
- хотя их легко набирать, они могут быть непонятными для человека, незнакомого с языком. [20]
- они не защищают от инъекционных атак [ нужна ссылка ]
Escape-последовательность
[ редактировать ]Escape-последовательности аналогичны escape-символам, за исключением того, что они обычно состоят из какой-то мнемоники, а не из одного символа. Одно из применений — строковые литералы , включающие символ двойной кавычки («»). Например, в Perl код:
print "Nancy said \x22Hello World!\x22 to the crowd."; ### use \x22
выдает тот же результат, что и:
print "Nancy said \"Hello World!\" to the crowd."; ### use escape char
Одним из недостатков escape-последовательностей, когда они используются людьми, является необходимость запоминать коды, представляющие отдельные символы (см. также: ссылка на символьный объект , ссылка на числовой символ ).
Разделители в двойных кавычках
[ редактировать ]В отличие от escape-последовательностей и escape-символов, двойные разделители предоставляют еще один способ избежать столкновения разделителей. Некоторые языки, например, позволяют использовать одинарную кавычку (') или двойную кавычку ("") для указания строкового литерала. Например, в Perl :
print 'Nancy said "Hello World!" to the crowd.';
производит желаемый результат, не требуя экранирования. Однако этот подход работает только в том случае, если строка не содержит оба типа кавычек.
Заполнение разделителей кавычек
[ редактировать ]В отличие от escape-последовательностей и escape-символов, заполняющие разделители предоставляют еще один способ избежать столкновения разделителей. Visual Basic , например, использует двойные кавычки в качестве разделителей. Это похоже на экранирование разделителя.
print "Nancy said ""Hello World!"" to the crowd."
производит желаемый результат, не требуя экранирования. Однако, как и при обычном экранировании, использование большого количества кавычек может привести к путанице. Код для печати приведенного выше исходного кода выглядел бы более запутанным:
print "print ""Nancy said """"Hello World!"""" to the crowd."""
Настраиваемые альтернативные разделители кавычек
[ редактировать ]В отличие от двойных разделителей, множественные разделители еще более гибки и позволяют избежать коллизий разделителей. [7] : 63
Например, в Perl :
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 — это два, которые это делают. [7] : 62 [21]
Граница контента
[ редактировать ]Граница содержимого — это особый тип разделителя, специально разработанный для предотвращения коллизий разделителей. Он работает, позволяя автору указать последовательность символов, которая гарантированно всегда указывает границу между частями в сообщении, состоящем из нескольких частей, без какой-либо другой возможной интерпретации. [22]
Разделитель часто генерируется из случайной последовательности символов, появление которой в контенте статистически маловероятно. За ним может следовать идентификационный знак, такой как UUID , временная метка или какой-либо другой отличительный знак. Альтернативно, содержимое можно сканировать, чтобы гарантировать отсутствие в тексте разделителя. Это может позволить сделать разделитель короче или проще, а также повысить удобочитаемость документа. ( См., например , MIME , здесь документы ).
Пробелы или отступы
[ редактировать ]Некоторые языки программирования и программирования позволяют использовать пробельные разделители или отступы как средство указания границ между независимыми областями в тексте. [23]
Синтаксис регулярных выражений
[ редактировать ]При указании регулярного выражения также можно использовать альтернативные разделители для упрощения синтаксиса операций сопоставления и замены в Perl . [24]
Например, в Perl можно указать простую операцию сопоставления со следующим синтаксисом:
$string1 = 'Nancy said "Hello World!" to the crowd.'; # specify a target string
print $string1 =~ m/[aeiou]+/; # match one or more vowels
Синтаксис достаточно гибок, чтобы указывать операции сопоставления с альтернативными разделителями, что позволяет легко избежать конфликта разделителей:
$string1 = 'Nancy said "http://Hello/World.htm" is not a valid address.'; # target string
print $string1 =~ m@http://@; # match using alternate regular expression delimiter
print $string1 =~ m{http://}; # same as previous, but different delimiter
print $string1 =~ m!http://!; # same as previous, but different delimiter.
Здесь документ
[ редактировать ]Документ Here позволяет включать произвольное содержимое, описывая специальную конечную последовательность. Многие языки поддерживают это, включая PHP , сценарии bash , Ruby и Perl . Документ здесь начинается с описания того, какой будет конечная последовательность, и продолжается до тех пор, пока эта последовательность не появится в начале новой строки. [25]
Вот пример на Perl:
print <<ENDOFHEREDOC;
It's very hard to encode a string with "certain characters".
Newlines, commas, and other characters can cause delimiter collisions.
ENDOFHEREDOC
Этот код напечатает:
It's very hard to encode a string with "certain characters". Newlines, commas, and other characters can cause delimiter collisions.
Благодаря использованию специальной конечной последовательности в строке можно использовать любые символы.
ASCII-броня
[ редактировать ]Хотя в основном используется как механизм текстового кодирования двоичных данных, Бронирование ASCII — это метод программирования и системного администрирования, который также помогает в некоторых случаях избежать конфликта разделителей. [26] [27] Этот метод отличается от других подходов, описанных выше, поскольку он более сложен и, следовательно, не подходит для небольших приложений и простых форматов хранения данных. В этом методе используется специальная схема кодирования, такая как base64 , чтобы гарантировать, что разделители или другие значимые символы не появляются в передаваемых данных. Целью является предотвращение многоуровневого экранирования , например, двойных кавычек .
Этот метод используется, например, в веб-разработки Microsoft ASP.NET технологии и тесно связан с компонентом «VIEWSTATE» этой системы. [28]
Пример
[ редактировать ]Следующий упрощенный пример демонстрирует, как этот метод работает на практике.
Первый фрагмент кода показывает простой HTML-тег , в котором значение VIEWSTATE содержит символы, несовместимые с разделителями самого HTML-тега:
<input type="hidden" name="__VIEWSTATE" value="BookTitle:Nancy doesn't say "Hello World!" anymore." />
Этот первый фрагмент кода неправильно сформирован и поэтому не будет работать должным образом в развернутой системе «реального мира».
Для хранения произвольного текста в атрибуте HTML сущности HTML можно использовать . В данном случае """ заменяет двойную кавычку:
<input type="hidden" name="__VIEWSTATE" value="BookTitle:Nancy doesn't say "Hello World!" anymore." />
В качестве альтернативы можно использовать любую кодировку, не включающую символы, имеющие особое значение в контексте, например base64:
<input type="hidden" name="__VIEWSTATE" value="Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu" />
Или процентное кодирование :
<input type="hidden" name="__VIEWSTATE" value="BookTitle:Nancy%20doesn%27t%20say%20%22Hello%20World!%22%20anymore." />
Это предотвращает столкновение разделителей и гарантирует, что несовместимые символы не появятся внутри HTML-кода, независимо от того, какие символы встречаются в исходном (декодированном) тексте. [28]
См. также
[ редактировать ]- CDATA
- Десятичный разделитель
- Значения, разделенные разделителями
- Escape-последовательность
- Строковый литерал
- Значения, разделенные табуляцией
Ссылки
[ редактировать ]- ^ «Определение: разделитель» . Федеральный стандарт 1037C — Телекоммуникации: Глоссарий терминов в области электросвязи . Архивировано из оригинала 5 марта 2013 г. Проверено 25 ноября 2019 г.
- ^ «Что такое разделитель?» . www.computerhope.com . Проверено 9 августа 2020 г.
- ^ Рол, Джеффри С. (1973). Программирование на Фортране . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-7190-0555-8 . описание метода в нотации Холлерита на языке программирования Фортран.
- ^ Перейти обратно: а б де Мур, Жорж Дж. (1993). Прогресс в стандартизации в области информатики здравоохранения . ИОС Пресс. ISBN 90-5199-114-2 . п. 141
- ^ Фридл, Джеффри Э.Ф. (2002). Освоение регулярных выражений: мощные методы Perl и других инструментов . О'Рейли. ISBN 0-596-00289-0 . п. 319
- ^ Скотт, Майкл Ли (1999). Прагматика языков программирования . Морган Кауфманн. ISBN 1-55860-442-1 .
- ^ Перейти обратно: а б с Уолл, Ларри ; Орвант, Джон (июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. ISBN 0-596-00027-8 .
- ^ Кауфманн, Мэтт (2000). Компьютерное мышление: подход . Спрингер. ISBN 0-7923-7744-3 . п. 3
- ^ Мейер, Марк (2005). Исследования в области информатики . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-7637-3832-7 . ссылается на языки программирования в стиле C, в которых заметно фигурные скобки и точки с запятой.
- ^ Диллиган, Роберт (1998). Компьютеры в эпоху Интернета . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-306-45972-6 . Описывает синтаксис и разделители, используемые в HTML.
- ^ Перейти обратно: а б Шварц, Рэндал (2005). Изучение Перла . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-596-10105-3 . Описывает строковые литералы .
- ^ Ватт, Эндрю (2003). Сэмс: Изучите XML за 10 минут . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-672-32471-0 . Описывает инструкцию обработки XML. п. 21.
- ^ Кабрера, Гарольд (2002). C# для Java-программистов . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-1-931836-54-8 . Описывает однострочные и многострочные комментарии. п. 72.
- ^ «Спецификация серверных страниц Джакарты, версия 4.0 Спецификация серверных страниц Акарты, версия 4.0» . Гитхаб . Проверено 10 февраля 2023 г.
- ^ ISO/TC 97/SC 2 (1 декабря 1975 г.). Набор управляющих символов для ISO 646 (PDF) . ITSCJ/ IPSJ . ИСО-ИК -1.
{{citation}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Американский национальный институт стандартов (1 декабря 1975 г.). Набор графических символов ASCII (PDF) . ITSCJ/ IPSJ . ИСО-ИК -6.
- ^ Левин, Дональд (1991). Руководство программиста Posix . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-937175-73-6 . Описывает использование control-zp 156,
- ^ Фридл, Джеффри (2006). Освоение регулярных выражений . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-596-52812-6 . описание решений проблем со встроенными разделителями с. 472.
- ^ Обсуждение текста с разделителями ASCII и CSV и разделителей табуляцией
- ^ Карель, Питер (2006). Автоматизация InDesign с помощью регулярных выражений . О'Рейли. п. 11. ISBN 0-596-52937-6 .
- ^ Юкихиро, Мацумото (2001). Рубин в двух словах О'Рейли. ISBN 0-596-00214-9 . В Ruby они обозначаются как общие строки с разделителями . п. 11
- ^ Справочник по сетевым протоколам . Javvin Technologies Inc. 2005. ISBN. 0-9740945-2-8 . п. 26
- ^ Компьютерная лингвистика и интеллектуальная обработка текста . Оксфорд Оксфордшир: Издательство Оксфордского университета. 2001. ISBN 978-3-540-41687-6 . Описывает разделители пробелов. п. 258.
- ^ Фридл, Джеффри (2006). Освоение регулярных выражений . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-596-52812-6 . страница 472.
- ^ Операторы Perl и приоритет
- ^ Ри, Человек (2003). Интернет-безопасность: криптографические принципы, алгоритмы и протоколы . Джон Уайли и сыновья. ISBN 0-470-85285-2 . (пример использования защиты ASCII в приложениях шифрования)
- ^ Гросс, Кристиан (2005). Открытый исходный код для администраторов Windows . Чарльз Ривер Медиа. ISBN 1-58450-347-5 . (пример использования защиты ASCII в приложениях шифрования)
- ^ Перейти обратно: а б Калани, Амит (2004). Разработка и реализация веб-приложений с помощью Visual C#. NET и Visual Studio. СЕТЬ . Que. ISBN 0-7897-2901-6 . (описывает использование кодировки Base64 и VIEWSTATE внутри исходного кода HTML)