Подтвердить что ты не робот

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

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

Информация, которую я знаю:

HTML:

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

XML:

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

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

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

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

[Определение: ссылки на объекты и символы могут использоваться как вывести левую угловую скобку, амперсанд и другие разделители. Множество общих объектов (amp, lt, gt, apos, quot) указывается для этого цель. Также могут использоваться числовые ссылки на символы; они есть расширяется сразу после распознавания и должен рассматриваться как символ данных, поэтому числовые ссылки на символы "& # 60;" и "& # 38;" могут чтобы избежать < и когда они встречаются в символьных данных.]

Какие символы должны скрываться в ссылках на сущности в HTML?
Какие символы должны скрываться в ссылках на сущности в 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 десятичный 60), чтобы избежать возможной путаницы с началом тег (открытый разделитель открытого тега).

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

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

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

HTML намного более правдоподобный по правилам, но звучит так, как будто я должен:

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

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


Обновить два

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

8.3 Сериализация HTML-фрагментов

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

Заменить любое появление символа "&" строкой "&amp;".

Заменить любые вхождения символа U + 00A0 NO-BREAK SPACE string "&nbsp;".

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

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

Что я читаю как HTML:

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

Ответ 1

Во-первых, вы сравниваете спецификацию HTML 4.01 с HTML 5 шт.. 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>)

Обе спецификации также согласны с этим.

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