Каковы специальные символы HTML и XML?

каковы специальные зарезервированные символьные сущности в HTML и XML?

информация, которая у меня есть, говорит:

HTML:

  • & (замените &)
  • < (замените &lt;)
  • > (замените &gt;)
  • " (заменить &quot;)
  • ' (замените &apos;)

XML-код:

  • < (замените &lt;)
  • > (замените &gt;)
  • & (замените &amp;)
  • ' (замените &apos;)
  • " (замените &quot;)

но я не могу найти документацию ни по одному из них.

W3C упоминает, в расширяемый язык разметки (XML) 1.0 (пятое издание), некоторые предопределенные ссылки на сущности. Но он говорит, что эти сущности предопределены (так же, как &copy; предопределено); не то, что они должны быть экранированы:

4.6 Предопределенные Объекты

[определение: ссылки на сущности и символы могут использоваться для побег левая угловая скобка, амперсанд и другие разделители. Набор общих сущностей (amp, lt, gt, apos, quot) указывается для этого цель. Могут также использоваться числовые символьные ссылки; расширяется сразу же при распознавании и должен рассматриваться как символ данные, поэтому числовые символьные ссылки "

какие символы должны быть экранированным в ссылки на сущности в HTML-код?
Какие персонажи!--89-->должны быть экранированным в ссылки на сущности в XML?


обновление:

с расширяемый язык разметки (XML) 1.0 (пятое издание):

2.4 символьные данные и разметка

символ амперсанда (&) и левая угловая скобка (<) не должен появляются в их буквальной форме, за исключением случаев использования в качестве разделителей разметки, или в комментарии, инструкции по обработке или разделе CDATA.
Если они нужны в другом месте, они должны быть экранированным с помощью любого числового ссылки на символы или строки "&amp;" и "&lt;" соответственно.

правая угловая скобка (>) может быть представлено с помощью строка"&gt;", и должны, для совместимости, следует избегать использования либо "&gt; "или ссылка на символ, когда он появляется в строке"]]>" в содержимом, когда эта строка не помечает конец CDATA раздел.

чтобы значения атрибутов содержали как одинарные, так и двойные кавычки, Апостроф или символ одинарной кавычки (') может быть представлено как "&apos;", и символ двойной кавычки (") как "&quot;".

я прочитал первое как говорящее, что

должно быть:

  • < (&lt;) должно быть
  • & (&amp;) должно быть

мая, а должны при появлении как ]]>

  • > (&gt;) должны быть, если появляется как ]]>

и ' и " не надо экранировано вообще; если вы не хотите иметь кавычки внутри цитируемых атрибутов.


с спецификация HTML 4.01, представление документа HTML:

5.3.2 ссылки на сущности символов

авторы, желающие поставить "< "символ в тексте должен использовать"&lt;" (ASCII decimal 60), чтобы избежать возможной путаницы с началом тег (начать тег открыть разделитель).

аналогично, авторы должны использовать "&gt;" (ASCII decimal 62) в тексте вместо ">", чтобы избежать проблем со взрослыми агенты пользователей, которые неправильно воспринимают это как конец тега (тег закрыть разделитель), когда он появляется в кавычках значений атрибутов.

авторы должны использовать "&amp; "(ASCII decimal 38) вместо"&", чтобы избежать путаница с началом символьной ссылки (entity ссылка открыть разделитель). Авторы также должны использовать "&amp; " in значения атрибутов, поскольку ссылки на символы разрешены в CDATA значение атрибута.

некоторые авторы используют ссылку на сущность символа"&quot;" кодировать экземпляры двойной кавычки (") так как этот символ может быть используется для разграничения значений атрибутов.

HTML гораздо более wishy-washy по правилам, но похоже, что я должны:

  • < должна быть с &lt;
  • > должен быть с &gt;
  • & должен быть с &amp;
  • " должен быть с &quot;

и если " может быть ссылкой на сущность, я также должен заменить ' С &amp;.


Обновить Два

с HTML5-словарь и связанные с ним API для HTML и XHTML:

8.3 сериализации Фрагменты HTML-кода

убегающую строку (для целей приведенного выше алгоритма) состоит выполнения следующих шагов:

заменить все вхождения "& "символ по строке"&amp;".

замените все вхождения символа пробела без перерыва U+00A0 символом строка"&nbsp;".

если алгоритм был вызван в режиме атрибут, заменить вхождений "" "символ строкой"&quot;".

если алгоритм не был вызван в режиме атрибут, заменить случаи "< "символ по строке"&lt;", и любой случаи "> "символ по строке"&gt;".

который я читаю как HTML-код:

  • & by &amp; всегда
  •   by &nbsp; всегда
  • " by &quot; если это внутри атрибута
  • < by &lt; если это не в атрибуте (т. е. атрибуты могут содержать <)
  • > by &gt; если это не в атрибуте (т. е. атрибуты могут содержать >)

1 ответов


во-первых, вы сравниваете спецификация HTML 4.01 С HTML 5 one. HTML5 более тесно связан с XML, чем HTML 4.01 (поэтому у нас есть XHTML), поэтому этот ответ будет придерживаться HTML 5 и XML.

ваши цитируемые ссылки согласуются по следующим пунктам:

  • < всегда должен быть представлен с &lt; при отсутствии указания инструкции по обработке
  • > должны всегда будьте представлены с &gt; при отсутствии указания инструкции по обработке
  • & всегда должен быть представлен с &amp;
  • за исключением, когда в <![CDATA[ ]]> (который применяется только к XML)

я согласен с этим на 100%. Вы никогда не хотите, чтобы парсер ошибочно принимал литералы за инструкции, поэтому всегда нужно кодировать любой символ без пробела (см. ниже). Хорошие Парсеры знают, что все, что содержится внутри <![CDATA[ ]]> несколько не инструкции, поэтому кодировка там не нужна.

на практике я никогда не кодирую ' или " если

  • он появляется в пределах значения атрибута (XML или HTML)
  • он появляется в тексте XML-тегов. (<tag>&quot;Yoinks!&quot;, he said.</tag>)

обе спецификации также соглашаются с этим.

таким образом, единственным пунктом раздора является (space). The only mention of it in either specification is when serialization is attempted. When not, you should always use a literal (пробел). Если вы не пишете свой собственный парсер, я не вижу нужно делать какую-либо сериализацию, так что это не имеет значения.