При выводе HTML существует несколько различных мест, где текст может быть интерпретирован как управляющие символы, а не как текстовые литералы. Например, в "обычном" тексте (то есть, вне любой разметки элемента):
<div>This is regular text</div>
А также в значениях атрибутов:
<input value="this is value text">
И, я верю в комментариях HTML:
<!-- This text here might be programmatically generated
and could, in theory, contain the double-hyphen character
sequence, which is verboten inside comments -->
Каждый из этих трех видов текста имеет различные правила для того, как его нужно оставить для обработки как неразметку. Таким образом, мой первый вопрос, там какие-либо другие контексты в HTML, в котором символы могут быть интерпретированы как разметка/управляющие символы? Вышеупомянутые контексты ясно имеют различные правила о какой потребности быть оставленными.
Второй вопрос, каковы канонические, глобально-безопасные-списки символов (для каждого контекста), которого нужно оставить, чтобы гарантировать, что какой-либо встроенный текст рассматривают как неразметку? Например, в теории только необходимо выйти 'и "в значениях атрибута, с тех пор в значении атрибута только заключительный символ-разделитель (' или", в зависимости от который разделитель значение атрибута, запущенное с), имел бы значение управления. Точно так же в рамках "обычного" текста только <и и имеют значение управления. (Я понимаю, что не все синтаксические анализаторы HTML идентичны. Я главным образом интересуюсь тем, что является минимальным набором символов, для которых нужен выход для успокоения приспосабливающего спецификации синтаксического анализатора.)
Мимоходом: следующий текст бросит ошибки как Строгий HTML 4.01:
<a href="http://example.com/file.php?x=1&y=2">foo</a>
А именно, это говорит, что не знает то, что объект "&y", как предполагается. При помещении пространства после и, однако, оно проверяет очень хорошо. Но если Вы генерируете это на лету, Вы, вероятно, не собираетесь хотеть проверить, вызовет ли каждое использование и ошибку проверки, и вместо этого просто выйти весь и в значениях атрибута.
<div>This is regular text</div>
Текстовое содержание: &
должно быть экранировано. <
должен быть экранирован.
При создании документа в кодировке, отличной от UTF, символы, которые не помещаются внутри выбранной кодировки, должны быть экранированы.
В XHTML (и XML в целом), последовательность ]]>
не должна встречаться в текстовом содержимом, поэтому в этом конкретном случае один из символов в этой последовательности должен быть экранирован, традиционно >
. Для единообразия спецификация Canonical XML выбирает экранирование >
каждый раз в текстовом содержимом, что является неплохой стратегией для функции экранирования, хотя вы, безусловно, можете пропустить ее при ручном редактировании.
<input value="this is value text">
Значения атрибутов : &
необходимо экранировать. Ограничитель значений атрибута "
или '
должен быть экранирован.
Как для текстового содержимого, так и для значений атрибутов : в XHTML в XML 1.1 вы должны экранировать запрещенные символы, которые представляют собой символ удаления и управляющие коды C0 и C1, табуляцию минус, CR, LF и NEL. Итого [\ x01- \ x08 \ x0B \ x0C \ x0E- \ x1F \ x7F- \ x84 \ x86- \ x9F]
. Нулевой символ может вообще не включаться, даже если он экранирован в XML 1.1. Вне XML 1.1 вы вообще не можете использовать ни один из этих символов, и нет веской причины, по которой вы когда-либо хотели бы это делать.
<!-- This text here might be programmatically generated
and could, in theory, contain the double-hyphen character
sequence, which is verboten inside comments -->
Да, но поскольку экранирование внутри комментариев невозможно, вы ничего не можете с этим поделать Это. Если вы напишете
, это буквально означает комментарий, содержащий «амперсанд-буква, l-буква, t-точка с запятой», и будет отражен как таковой в DOM или другом информационном наборе. Комментарий, содержащий -
, просто не может быть сериализован вообще.
разделы и
Pi
в XML также не могут использовать экранирование. Традиционное решение для сериализации раздела CDATA, включающего последовательность ]>
, состоит в том, чтобы разделить эту последовательность на два раздела CDATA, чтобы они не встречались вместе. Вы не можете сериализовать его в одном разделе CDATA, и вы не можете сериализовать PI с ?>
в данных.
CDATA-элементы, такие как