Какие HTML и XML специальные символы? - PullRequest
26 голосов
/ 30 августа 2011

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

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

HTML:

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

XML:

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

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

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

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

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

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

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

1 Ответ

13 голосов
/ 02 сентября 2011

Сначала вы сравниваете спецификацию 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>)

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

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

...