WikiDer > Разделитель
А разделитель представляет собой последовательность из одного или нескольких символы для определения границы между отдельными независимыми регионами в простой текст, математические выражения или другой потоки данных.[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]
Смотрите также
- CDATA
- Десятичный разделитель
- Значения, разделенные разделителями
- Последовательность выхода
- Строковый литерал
- Значения, разделенные табуляцией
Рекомендации
- ^ а б «Сборник математических символов: разделители». Математическое хранилище. 2020-03-01. Получено 2020-08-09.
- ^ «Определение: разделитель». Федеральный стандарт 1037C - Телекоммуникации: Глоссарий телекоммуникационных терминов. В архиве из оригинала от 05.03.2013. Получено 2019-11-25.
- ^ "Что такое разделитель?". www.computerhope.com. Получено 2020-08-09.
- ^ Рол, Джеффри С. (1973). Программирование на Фортране. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-7190-0555-8. описание метода в нотации Холлерита на языке программирования Фортран.
- ^ а б де Моор, Жорж Дж. (1993). Прогресс в стандартизации информатики здравоохранения. IOS Press. 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). Компьютерное мышление: подход. Springer. ISBN 0-7923-7744-3.п. 3
- ^ Мейер, Марк (2005). Исследования в области компьютерных наук. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-7637-3832-7. ссылки на языки программирования в стиле C, в которых используются фигурные скобки и точки с запятой.
- ^ Диллиган, Роберт (1998). Компьютеры в эпоху Интернета. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-306-45972-6.Описывает синтаксис и разделители, используемые в HTML.
- ^ а б Шварц, Рэндал (2005). Изучение Perl. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-596-10105-3.Описывает строковые литералы.
- ^ Ватт, Эндрю (2003). Sams научитесь XML за 10 минут. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-672-32471-0. Описывает инструкцию по обработке XML. п. 21.
- ^ Кабрера, Гарольд (2002). C # для программистов на Java. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-1-931836-54-8. Описывает однострочные и многострочные комментарии. п. 72.
- ^ «Документация по шаблону Smarty». Получено 2010-03-12. См., Например, документацию по системе шаблонов Smarty, «экранирование разделителей шаблонов».
- ^ «Набор управляющих символов для ISO 646» (PDF). Международная организация по стандартизации. 1 декабря 1975 г.
- ^ «Набор графических символов ASCII» (PDF). Международная организация по стандартизации. 1 декабря 1975 г.
- ^ Левин, Дональд (1991). Руководство программиста Posix. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-937175-73-6. Описывает использование control-z. п. 156,
- ^ Фридл, Джеффри (2006). Освоение регулярных выражений. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-596-52812-6. описание решений для проблем со встроенными разделителями стр. 472.
- ^ Обсуждение текста с разделителями ASCII в сравнении с CSV и разделителями табуляции
- ^ Кэрел, Питер (2006). Автоматизация InDesign с помощью регулярных выражений. О'Рейли. ISBN 0-596-52937-6.п. 11
- ^ Стены; Ларри; Джон Орвант (Июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. п. 63. ISBN 0-596-00027-8.
- ^ Стены; Ларри; Джон Орвант (Июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. п. 62. ISBN 0-596-00027-8.
- ^ Юкихиро, Мацумото (2001). Рубин в двух словах. О'Рейли. ISBN 0-596-00214-9. В Ruby они обозначены как общие строки с разделителями. п. 11
- ^ Javvin Technologies, Incorporated (2005 г.). Справочник по сетевым протоколам. Javvin Technologies Inc. ISBN 0-9740945-2-8. п. 26
- ^ 200, Циклинг (2001). Компьютерная лингвистика и интеллектуальная обработка текста. Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-3-540-41687-6.CS1 maint: числовые имена: список авторов (ссылка на сайт) Описывает разделители пробелов. п. 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)
внешняя ссылка
- Метаформаты файлов данных из Искусство программирования под Unix от Эрик Стивен Рэймонд
- Что такое разделитель пользователя Маргарет Роуз.