Какие 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; msgstr "и для совместимости должен быть экранирован, используя либо" &gt; "или ссылка на символ, когда он появляется в строке" ]]> "в содержании, когда эта строка не отмечает конец раздела CDATA.

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

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

должно быть:

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

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

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

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


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

5.3.2 Ссылки на символьные объекты

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

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

Авторы должны использовать &amp; "(ASCII десятичное 38) вместо" & "Во избежание путаницы с началом ссылки на символ (открытый разделитель ссылки на сущность). Авторы также должны использовать" &amp; msgstr "в значениях атрибутов, поскольку в значениях атрибутов 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; всегда
  •   от &nbsp; всегда
  • " от &quot; если это внутри атрибута
  • < от &lt; если это не в атрибуте (т.е. атрибуты могут содержать <)
  • > от &gt; если это не в атрибуте (т.е. атрибуты могут содержать >)

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>)

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

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

Другие вопросы по тегам