Какие специальные символы 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). Также могут использоваться числовые ссылки на символы; они раскрываются сразу после распознавания и должны рассматриваться как символьные данные, поэтому числовые символьные ссылки «<» и «&» могут использоваться для экранирования ‹и &, когда они встречаются в символьных данных.]

Какие символы необходимо экранировать в ссылках на объекты в HTML? Какие символы необходимо экранировать в ссылках на сущности в XML?


Обновление:

Из Extensible Markup Language (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 62) вместо «>», чтобы избежать проблем со старыми пользовательскими агентами, которые неправильно воспринимают это как конец тега (закрывающий разделитель тега), когда он появляется в значениях атрибутов в кавычках.

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

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

HTML гораздо менее строг в отношении правил, но похоже, что я должен:

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

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


Обновление два

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

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

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

Замените любое вхождение символа «&» строкой «&amp;».

Замените все вхождения символа U + 00A0 NO-BREAK SPACE строкой «&nbsp;».

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

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

Я читаю его как HTML:

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

person Ian Boyd    schedule 30.08.2011    source источник
comment
Вам действительно следует отделить свой вопрос от ответа.   -  person John Saunders    schedule 31.08.2011
comment
У меня нет ответа. У меня есть исследования, которые могут быть правильными, а могут и нет. Кто-то, кто знает ответ, может опубликовать его, а люди, которые знают, могут проголосовать за него, если он на самом деле правильный.   -  person Ian Boyd    schedule 31.08.2011
comment
Если приведенное выше не является ответом, тогда вам нужно более четко понимать, что вы ищете!   -  person John Saunders    schedule 31.08.2011
comment
Я нашел пять разных источников, в которых говорится о трех разных вещах. Тот, кто знает, должен решить, какой из источников правильный, а какой нет.   -  person Ian Boyd    schedule 31.08.2011
comment
Странно, что HTML 4 и 5 говорят противоположные вещи относительно того, когда следует экранировать > (в атрибуте или нет).   -  person LarsH    schedule 15.02.2012


Ответы (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 (пробел). Если вы не пишете свой собственный синтаксический анализатор, я не вижу необходимости в какой-либо сериализации, так что это не относится к делу.

person johnluetke    schedule 02.09.2011
comment
Нет причин избегать >, за исключением очень особого и чрезвычайно редкого случая ]]> в данных в линеаризации XML. При желании его можно экранировать для симметрии (с экранированием <). Это то, что на самом деле говорят ссылки. И нет причин для экранирования ' или ", кроме как внутри значения атрибута, когда тот же символ используется в качестве разделителя значения атрибута. - person Jukka K. Korpela; 14.10.2013
comment
Если вы кодируете кавычки только в том случае, если они появляются внутри значения атрибута или внутри текстового содержимого элемента, в каком другом контексте это оставляет этот текст, чтобы вы его не избегали? - person dan carter; 24.03.2014