Jump to content

Разделитель

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

Разделитель это последовательность из одного или нескольких символов для указания границы между отдельными независимыми областями в виде обычного текста , математических выражений или других потоков данных . [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 &quot;Hello World!&quot; 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]

См. также

[ редактировать ]
  1. ^ «Определение: разделитель» . Федеральный стандарт 1037C — Телекоммуникации: Глоссарий терминов в области электросвязи . Архивировано из оригинала 05 марта 2013 г. Проверено 25 ноября 2019 г.
  2. ^ «Что такое разделитель?» . www.computerhope.com . Проверено 9 августа 2020 г.
  3. ^ Рол, Джеффри С. (1973). Программирование на Фортране . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-7190-0555-8 . описание метода в нотации Холлерита на языке программирования Фортран.
  4. ^ Jump up to: а б де Мур, Жорж Дж. (1993). Прогресс в стандартизации в области информатики здравоохранения . ИОС Пресс. ISBN  90-5199-114-2 . п. 141
  5. ^ Фридл, Джеффри Э.Ф. (2002). Освоение регулярных выражений: мощные методы Perl и других инструментов . О'Рейли. ISBN  0-596-00289-0 . п. 319
  6. ^ Скотт, Майкл Ли (1999). Прагматика языков программирования . Морган Кауфманн. ISBN  1-55860-442-1 .
  7. ^ Jump up to: а б с Уолл, Ларри ; Орвант, Джон (июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. ISBN  0-596-00027-8 .
  8. ^ Кауфманн, Мэтт (2000). Компьютерное мышление: подход . Спрингер. ISBN  0-7923-7744-3 . п. 3
  9. ^ Мейер, Марк (2005). Исследования в области информатики . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-7637-3832-7 . ссылается на языки программирования в стиле C, в которых заметно фигурные скобки и точки с запятой.
  10. ^ Диллиган, Роберт (1998). Компьютеры в эпоху Интернета . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-306-45972-6 . Описывает синтаксис и разделители, используемые в HTML.
  11. ^ Jump up to: а б Шварц, Рэндал (2005). Изучение Перла . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-596-10105-3 . Описывает строковые литералы .
  12. ^ Ватт, Эндрю (2003). Сэмс: Изучите XML за 10 минут . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-672-32471-0 . Описывает инструкцию обработки XML. п. 21.
  13. ^ Кабрера, Гарольд (2002). C# для Java-программистов . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-1-931836-54-8 . Описывает однострочные и многострочные комментарии. п. 72.
  14. ^ «Спецификация серверных страниц Джакарты, версия 4.0 Спецификация серверных страниц Акарты, версия 4.0» . Гитхаб . Проверено 10 февраля 2023 г.
  15. ^ ISO/TC 97/SC 2 (1 декабря 1975 г.). Набор управляющих символов для ISO 646 (PDF) . ITSCJ/ IPSJ . ИСО-ИК -1. {{citation}}: CS1 maint: числовые имена: список авторов ( ссылка )
  16. ^ Американский национальный институт стандартов (1 декабря 1975 г.). Набор графических символов ASCII (PDF) . ITSCJ/ IPSJ . ИСО-ИК -6.
  17. ^ Левин, Дональд (1991). Руководство программиста Posix . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-937175-73-6 . Описывает использование control-zp 156,
  18. ^ Фридл, Джеффри (2006). Освоение регулярных выражений . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-596-52812-6 . описание решений проблем со встроенными разделителями с. 472.
  19. ^ Обсуждение текста с разделителями ASCII и CSV и разделителей табуляцией
  20. ^ Карель, Питер (2006). Автоматизация InDesign с помощью регулярных выражений . О'Рейли. п. 11. ISBN  0-596-52937-6 .
  21. ^ Юкихиро, Мацумото (2001). Рубин в двух словах О'Рейли. ISBN  0-596-00214-9 . В Ruby они обозначаются как общие строки с разделителями . п. 11
  22. ^ Справочник по сетевым протоколам . Javvin Technologies Inc. 2005. ISBN.  0-9740945-2-8 . п. 26
  23. ^ Компьютерная лингвистика и интеллектуальная обработка текста . Оксфорд Оксфордшир: Издательство Оксфордского университета. 2001. ISBN  978-3-540-41687-6 . Описывает разделители пробелов. п. 258.
  24. ^ Фридл, Джеффри (2006). Освоение регулярных выражений . Оксфорд Оксфордшир: Издательство Оксфордского университета. ISBN  978-0-596-52812-6 . страница 472.
  25. ^ Операторы Perl и приоритет
  26. ^ Ри, Человек (2003). Интернет-безопасность: криптографические принципы, алгоритмы и протоколы . Джон Уайли и сыновья. ISBN  0-470-85285-2 . (пример использования защиты ASCII в приложениях шифрования)
  27. ^ Гросс, Кристиан (2005). Открытый исходный код для администраторов Windows . Чарльз Ривер Медиа. ISBN  1-58450-347-5 . (пример использования защиты ASCII в приложениях шифрования)
  28. ^ Jump up to: а б Калани, Амит (2004). Разработка и реализация веб-приложений с помощью Visual C#. NET и Visual Studio. СЕТЬ . Que. ISBN  0-7897-2901-6 . (описывает использование кодировки Base64 и VIEWSTATE внутри исходного кода HTML)
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 9e19170184e984c9031b2e8f36cc8e2c__1711461000
URL1:https://arc.ask3.ru/arc/aa/9e/2c/9e19170184e984c9031b2e8f36cc8e2c.html
Заголовок, (Title) документа по адресу, URL1:
Delimiter - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)