Разделитель - Delimiter

Стилистическое изображение фрагмента из CSV -форматированный текстовый файл. Запятые (показаны красным) используются как разделители полей.

А разделитель представляет собой последовательность из одного или нескольких символы для определения границы между отдельными независимыми регионами в простой текст, математические выражения или другой потоки данных.[1][2][3] Примером разделителя является запятая персонаж, который действует как разделитель полей в последовательности значения, разделенные запятыми. Другой пример разделителя - временной интервал, используемый для разделения букв и слов при передаче азбука Морзе.

В математика, разделители часто используются для указания объема операция, и может встречаться как отдельные символы (например, двоеточие в "") и как пара противоположно выглядящих символов (например, угловые кронштейны в ).[1]

Разделители представляют собой один из различных способов указания границ в поток данных. Декларативная запись Например, это альтернативный метод, который использует поле длины в начале потока данных, чтобы указать количество символов, которые содержит поток данных.[4]

Обзор

Разделители могут быть охарактеризованы как разделители полей и записей или как разделители скобок.

Разделители полей и записей

Разделители полей разделяют поля данных. Запишите разделители отдельных групп полей.[5]

Например, в формате файла CSV в качестве разделителя между поля, и конец линии индикатор как разделитель между записи:

fname, lname, возраст, зарплата, davolio, 33, 30000 $ ein, borakova, 28, 25250 $ тонны, raphael, 35, 28700 $

Это указывает на простой база данных плоских файлов Таблица используя формат файла CSV.

Разделители скобок

Разделители скобок, также называемые разделителями блоков, разделителями областей или сбалансированными разделителями, отмечают как начало, так и конец области текста.[6][7]

Распространенные примеры разделителей скобок:[8]

РазделителиОписание
( )Скобки. В Лисп Синтаксис языка программирования считается узнаваемым в первую очередь благодаря использованию круглых скобок.[9]
{ }Подтяжки (также называемые фигурные скобки.[10])
[ ]Скобки (обычно используются для обозначения нижнего индекса)
< >Угловые скобки.[11]
" "обычно используется для обозначения строковые литералы.[12]
' 'обычно используется для обозначения символьных литералов.[12]
<? ?>используется для обозначения XML инструкции по обработке.[13]
/* */используется для обозначения Комментарии в некоторых языках программирования.[14]
<% %>используется в некоторых веб-шаблоны указать языковые границы. Их также называют разделители шаблонов.[15]

Конвенции

Исторически сложилось так, что вычислительные платформы по соглашению использовали определенные разделители.[16][17] В следующих таблицах для сравнения приведено несколько примеров.

Языки программирования(Смотрите также, Сравнение языков программирования (синтаксис) ).

Строковый литералКонец заявления
Паскальодиночная цитататочка с запятой
Pythonдвойные кавычки, одиночные кавычкиконец линии (EOL)

Разделители полей и записей (Смотрите также, ASCII, Управляющий персонаж ).

Конец поляКонец записиКонец файла
Unix-подобный системы, включая macOS, AmigaOSВкладкаLFникто
Windows, MS-DOS, OS / 2, CP / MВкладкаCRLFнет (кроме CP / M), Control-Z[18]
Классическая Mac OS, Apple DOS, ProDOS, GS / OSВкладкаCRникто
ASCII / ЮникодСЕПАРАТОР БЛОКА
Позиция 31 (U + 001F)
ЗАПИСЬ СЕПАРАТОР
Позиция 30 (U + 001E)
РАЗДЕЛИТЕЛЬ ФАЙЛОВ
Позиция 28 (U + 001C)

Коллизия разделителей

Коллизия разделителей - это проблема, которая возникает, когда автор или программист вводит разделители в текст, фактически не намереваясь интерпретировать их как границы между отдельными областями.[5][19] В случае XML, например, это может происходить всякий раз, когда автор пытается указать угловой кронштейн характер.

В большинстве типов файлов есть как разделитель полей, так и разделитель записей, которые могут конфликтовать друг с другом. В случае значения, разделенные запятыми файлов, например, конфликт полей может происходить всякий раз, когда автор пытается включить запятую как часть значения поля (например, salary = "30 000 долларов США"), и конфликт разделителей записей будет происходить всякий раз, когда поле содержит несколько строк. В текстовых файлах часто возникают конфликты между разделителями записей и полей.

В некоторых случаях злоумышленник или злоумышленник может попытаться использовать эту проблему намеренно. Следовательно, конфликт разделителей может быть источником безопасности. уязвимости и подвиги. Злоумышленники могут воспользоваться конфликтом разделителей в таких языках, как SQL и HTML развертывать такие известные атаки, как SQL-инъекция и межсайтовый скриптинг соответственно.

Решения

Поскольку коллизия разделителей - очень распространенная проблема, были изобретены различные способы ее избежать. Некоторые авторы могут попытаться избежать проблемы, выбрав символ-разделитель (или последовательность символов), который вряд ли появится в самом потоке данных. Этот для этого случая подход может быть подходящим, но он обязательно зависит от правильного предположения о том, что будет отображаться в потоке данных, и не обеспечивает защиты от злонамеренных конфликтов. Поэтому применяются и другие, более формальные соглашения.

Текст с разделителями ASCII

Наборы символов ASCII и Unicode были разработаны для решения этой проблемы путем предоставления непечатаемых символов, которые можно использовать в качестве разделителей. Это диапазон от 28 до 31 ASCII.

ASCII ДекабрьСимволЮникод имяРаспространенное имяиспользование
28ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ЧЕТВЕРТЫЙразделитель файловКонец файла. Или между объединением того, что в противном случае могло бы быть отдельными файлами.
29ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ТРЕТИЙразделитель группМежду разделами данных. Не требуется в простых файлах данных.
30ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ДВАразделитель записейКонец записи или строки.
31ИНФОРМАЦИОННЫЙ СЕПАРАТОР ОДИНразделитель единицМежду полями записи или членами строки.

Использование ASCII 31 Разделитель единиц как разделитель полей и ASCII 30 Разделитель записей решает проблему разделителей полей и записей, которые появляются в потоке текстовых данных.[20]

Побег персонаж

Один из способов избежать столкновения разделителей - использовать escape-символы. С точки зрения языкового дизайна это приемлемо, но у них есть недостатки:

  • текст может быть нечитаемым, если он засорен многочисленными escape-символами, и эта проблема называется синдром наклоненной зубочистки (из-за использования для выхода / в Perl обычные выражения, что приводит к таким последовательностям, как " / /");
  • текст становится трудно анализировать с помощью регулярного выражения
  • они требуют механизма для «выхода из escape-последовательности», если они не предназначены для использования в качестве escape-символов; и
  • хотя их легко набрать, они могут быть загадочными для тех, кто не знаком с языком.[21]
  • они не защищают от инъекционных атак[нужна цитата ]

Последовательность выхода

Escape-последовательности похожи на escape-символы, за исключением того, что они обычно состоят из какой-то мнемоники, а не только из одного символа. Одно использование в строковые литералы с двойными кавычками ("). Например, в Perl, код:

Распечатать «Нэнси сказала  x22Hello World!  X22 толпе».;  ### используйте  x22

производит тот же результат, что и:

Распечатать «Нэнси сказала толпе " Hello World!  "».;      ### используйте escape-символ

Один из недостатков escape-последовательностей, когда они используются людьми, - это необходимость запоминать коды, представляющие отдельные символы (см. Также: ссылка на символьный объект, ссылка на числовой символ ).

Разделители двойных кавычек

В отличие от управляющих последовательностей и управляющих символов, двойные разделители предоставляют еще один способ избежать столкновения разделителей. Например, некоторые языки позволяют использовать одинарную кавычку (') или двойную кавычку (") для указания строкового литерала. Например, в Perl:

Распечатать Нэнси сказала: «Привет, мир!» к толпе ».;

производит желаемый результат без необходимости экранирования. Однако этот подход работает только тогда, когда строка не содержит и то и другое типы кавычек.

Заполнение разделителей кавычек

В отличие от управляющих последовательностей и управляющих символов, разделители-заполнители предоставляют еще один способ избежать столкновения разделителей. Visual Basic, например, в качестве разделителей используются двойные кавычки. Это похоже на экранирование разделителя.

Распечатать «Нэнси сказала« Привет, мир! »« Толпе ».

производит желаемый результат без необходимости экранирования. Однако, как и при обычном экранировании, при использовании большого количества кавычек он может сбивать с толку. Код для вывода исходного кода, приведенного выше, будет выглядеть более запутанным:

Распечатать "print" "Нэнси сказала" "" "Hello World!" "" "толпе." ""

Настраиваемые альтернативные разделители кавычек

В отличие от двойных разделителей, несколько разделителей еще более гибки, чтобы избежать коллизии разделителей.[22]

Например, в Perl:

Распечатать qq ^ Нэнси не хочет говорить «Привет, мир!» больше. ^;Распечатать qq @ Нэнси не хочет говорить "Привет, мир!" больше.@;Распечатать qq (Нэнси больше не хочет говорить «Привет, мир!».);

все производят желаемый результат за счет использования операторы котировок, которые позволяют использовать любой удобный символ в качестве разделителя. Хотя этот метод более гибкий, его поддерживают несколько языков. Perl и Рубин двое, которые делают.[23][24]

Граница содержимого

А граница содержания - это особый тип разделителя, специально разработанный для предотвращения столкновения разделителей. Он работает, позволяя автору указывать последовательность символов, которая гарантированно всегда указывает границу между частями в сообщении, состоящем из нескольких частей, без другой возможной интерпретации.[25]

Разделитель часто создается из случайной последовательности символов, появление которой в контенте статистически маловероятно. За ним может следовать опознавательный знак, например UUID, а отметка времени, или какой-нибудь другой отличительный знак. В качестве альтернативы, содержимое может быть отсканировано, чтобы гарантировать, что разделитель не появится в тексте. Это может позволить сделать ограничитель короче или проще и повысить удобочитаемость документа. (См. Например, MIME, Здесь документы ).

Пробелы или отступы

Некоторые языки программирования и компьютерные языки позволяют использовать разделители пробелов или отступ как средство определения границ между независимыми областями текста.[26]

Синтаксис регулярного выражения

При указании регулярное выражение, альтернативные разделители также могут использоваться для упрощения синтаксиса для матч и замена операции в Perl.[27]

Например, простая операция сопоставления может быть указана в Perl со следующим синтаксисом:

$ string1 = Нэнси сказала: «Привет, мир!» к толпе ».;    # указать целевую строкуРаспечатать $ string1 =~ m / [aeiou] + /;                           # соответствует одной или нескольким гласным

Синтаксис достаточно гибкий, чтобы определять операции сопоставления с альтернативными разделителями, что позволяет легко избежать столкновения разделителей:

$ string1 = «Нэнси сказала, что« http: //Hello/World.htm »не является действительным адресом».; # целевая строка   Распечатать $ string1 =~ м @ http: // @;       # совпадение с использованием альтернативного разделителя регулярного выраженияРаспечатать $ string1 =~ м {http: //};       # то же, что и предыдущий, но с другим разделителемРаспечатать $ string1 =~ м! http: //!;       # то же, что и предыдущий, но с другим разделителем.

Здесь документ

А Здесь документ позволяет включать произвольный контент, описывая специальную конечную последовательность. Многие языки поддерживают это, в том числе PHP, сценарии bash, Рубин и Perl. Документ здесь начинается с описания конечной последовательности и продолжается до тех пор, пока эта последовательность не появится в начале новой строки.[28]

Вот пример на perl:

Распечатать <<ENDOFHEREDOC;Очень сложно закодировать строку «определенными символами».Новые строки, запятые и другие символы могут вызывать конфликты разделителей.ENDOFHEREDOC

Этот код напечатает:

Очень сложно закодировать строку с «определенными символами». Новые строки, запятые и другие символы могут вызвать коллизии разделителей.

Использование специальной конечной последовательности позволяет использовать в строке любые символы.

ASCII броня

Хотя в основном используется как механизм текстового кодирования двоичных данных,Защита ASCII это метод программирования и системного администрирования, который также помогает избежать столкновения разделителей в некоторых случаях.[29][30] Этот метод отличается от других подходов, описанных выше, поскольку он более сложен и поэтому не подходит для небольших приложений и простых форматов хранения данных. В методе используется специальная схема кодирования, например base64, чтобы гарантировать, что разделитель или другие значащие символы не появляются в передаваемых данных. Цель - предотвратить появление многослойных побег, т.е. для двойные кавычки.

Этот прием используется, например, в Microsoft с ASP.NET технология веб-разработки и тесно связана с компонентом VIEWSTATE этой системы.[31]

Пример

Следующий упрощенный пример демонстрирует, как этот метод работает на практике.

Первый фрагмент кода показывает простой HTML-тег в котором значение VIEWSTATE содержит символы, несовместимые с разделителями самого тега HTML:

<ввод type ="скрытый" имя =«__VIEWSTATE» значение =«Название книги: Нэнси не говорит»Привет Мир!" больше." />

Этот первый фрагмент кода не правильно сформированный, и поэтому не будет работать должным образом в развернутой системе "реального мира".

Напротив, второй фрагмент кода показывает тот же тег HTML, за исключением того, что на этот раз несовместимые символы в значении VIEWSTATE удаляются с помощью применения кодировки base64:

<ввод type ="скрытый" имя =«__VIEWSTATE» значение ="Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu" />

Третий фрагмент кода показывает тот же HTML-тег, за исключением того, что на этот раз несовместимые символы в значении VIEWSTATE удаляются с помощью приложения процентное кодирование:

<ввод type ="скрытый" имя =«__VIEWSTATE» значение ="Название книги: Nancy% 20doesn% 27t% 20say% 20% 22Hello% 20World!% 22% 20anymore." />

Это предотвращает коллизию разделителей и гарантирует, что несовместимые символы не появятся внутри HTML-кода, независимо от того, какие символы появляются в исходном (декодированном) тексте.[31]

Смотрите также

Рекомендации

  1. ^ а б «Сборник математических символов: разделители». Математическое хранилище. 2020-03-01. Получено 2020-08-09.
  2. ^ «Определение: разделитель». Федеральный стандарт 1037C - Телекоммуникации: Глоссарий телекоммуникационных терминов. В архиве из оригинала от 05.03.2013. Получено 2019-11-25.
  3. ^ "Что такое разделитель?". www.computerhope.com. Получено 2020-08-09.
  4. ^ Рол, Джеффри С. (1973). Программирование на Фортране. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-7190-0555-8. описание метода в нотации Холлерита на языке программирования Фортран.
  5. ^ а б де Моор, Жорж Дж. (1993). Прогресс в стандартизации информатики здравоохранения. IOS Press. ISBN  90-5199-114-2. п. 141
  6. ^ Фридл, Джеффри Э. Ф. (2002). Освоение регулярных выражений: мощные методы для Perl и других инструментов. О'Рейли. ISBN  0-596-00289-0. п. 319
  7. ^ Скотт, Майкл Ли (1999). Прагматика языка программирования. Морган Кауфманн. ISBN  1-55860-442-1.
  8. ^ Стены; Ларри; Джон Орвант (Июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. ISBN  0-596-00027-8.
  9. ^ Кауфманн, Мэтт (2000). Компьютерное мышление: подход. Springer. ISBN  0-7923-7744-3.п. 3
  10. ^ Мейер, Марк (2005). Исследования в области компьютерных наук. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-7637-3832-7. ссылки на языки программирования в стиле C, в которых используются фигурные скобки и точки с запятой.
  11. ^ Диллиган, Роберт (1998). Компьютеры в эпоху Интернета. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-306-45972-6.Описывает синтаксис и разделители, используемые в HTML.
  12. ^ а б Шварц, Рэндал (2005). Изучение Perl. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-596-10105-3.Описывает строковые литералы.
  13. ^ Ватт, Эндрю (2003). Sams научитесь XML за 10 минут. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-672-32471-0. Описывает инструкцию по обработке XML. п. 21.
  14. ^ Кабрера, Гарольд (2002). C # для программистов на Java. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-1-931836-54-8. Описывает однострочные и многострочные комментарии. п. 72.
  15. ^ «Документация по шаблону Smarty». Получено 2010-03-12. См., Например, документацию по системе шаблонов Smarty, «экранирование разделителей шаблонов».
  16. ^ «Набор управляющих символов для ISO 646» (PDF). Международная организация по стандартизации. 1 декабря 1975 г.
  17. ^ «Набор графических символов ASCII» (PDF). Международная организация по стандартизации. 1 декабря 1975 г.
  18. ^ Левин, Дональд (1991). Руководство программиста Posix. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-937175-73-6. Описывает использование control-z. п. 156,
  19. ^ Фридл, Джеффри (2006). Освоение регулярных выражений. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-596-52812-6. описание решений для проблем со встроенными разделителями стр. 472.
  20. ^ Обсуждение текста с разделителями ASCII в сравнении с CSV и разделителями табуляции
  21. ^ Кэрел, Питер (2006). Автоматизация InDesign с помощью регулярных выражений. О'Рейли. ISBN  0-596-52937-6.п. 11
  22. ^ Стены; Ларри; Джон Орвант (Июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. п. 63. ISBN  0-596-00027-8.
  23. ^ Стены; Ларри; Джон Орвант (Июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. п. 62. ISBN  0-596-00027-8.
  24. ^ Юкихиро, Мацумото (2001). Рубин в двух словах. О'Рейли. ISBN  0-596-00214-9. В Ruby они обозначены как общие строки с разделителями. п. 11
  25. ^ Javvin Technologies, Incorporated (2005 г.). Справочник по сетевым протоколам. Javvin Technologies Inc. ISBN  0-9740945-2-8. п. 26
  26. ^ 200, Циклинг (2001). Компьютерная лингвистика и интеллектуальная обработка текста. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-3-540-41687-6.CS1 maint: числовые имена: список авторов (ссылка на сайт) Описывает разделители пробелов. п. 258.
  27. ^ Фридл, Джеффри (2006). Освоение регулярных выражений. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-596-52812-6. стр. 472.
  28. ^ Операторы Perl и их приоритет
  29. ^ Ри, человек (2003). Интернет-безопасность: криптографические принципы, алгоритмы и протоколы. Джон Уайли и сыновья. ISBN  0-470-85285-2.(пример использования защиты ASCII в приложениях шифрования)
  30. ^ Гросс, Кристиан (2005). Открытый исходный код для администраторов Windows. Чарльз Ривер Медиа. ISBN  1-58450-347-5.(пример использования защиты ASCII в приложениях шифрования)
  31. ^ а б Калани, Амит (2004). Разработка и внедрение веб-приложений с помощью Visual C #. NET и Visual Studio. СЕТЬ. Que. ISBN  0-7897-2901-6.(описывает использование кодировки Base64 и VIEWSTATE внутри исходного кода HTML)

внешняя ссылка