Каковы HTML и XML, специальные символы?
Каковы специальные зарезервированные объекты символов в HTML и XML?
Информация, которую я знаю:
HTML:
-
&
(замените на &
)
-
<
(заменить на <
)
-
>
(заменить на >
)
-
"
(замените на "
)
-
'
(заменить на '
)
XML:
-
<
(заменить на <
)
-
>
(заменить на >
)
-
&
(замените на &
)
-
'
(замените на '
)
-
"
(замените на "
)
Но я не могу найти документацию ни на одном из них.
В W3C упоминается в Extensible Markup Language (XML) 1.0 (пятое издание) определенные предопределенные ссылки на сущности. Но он говорит, что эти сущности предопределены (так же, как ©
предопределено); не то, чтобы они были экранированы:
[Определение: ссылки на объекты и символы могут использоваться как вывести левую угловую скобку, амперсанд и другие разделители. Множество общих объектов (amp, lt, gt, apos, quot) указывается для этого цель. Также могут использоваться числовые ссылки на символы; они есть расширяется сразу после распознавания и должен рассматриваться как символ данных, поэтому числовые ссылки на символы "& # 60;" и "& # 38;" могут чтобы избежать < и когда они встречаются в символьных данных.]
Какие символы должны скрываться в ссылках на сущности в HTML?
Какие символы должны скрываться в ссылках на сущности в XML?
Обновление
От Расширяемый язык разметки (XML) 1.0 (пятое издание):
Символ амперсанда (&
) и левая угловая скобка (<
) не должныпоявляются в их буквальной форме, за исключением случаев, когда они используются в качестве разделителей разметки, или в комментарии, инструкции обработки или секции CDATA.
Если они необходимы в другом месте, они должны быть экранированы с использованием либо числовых символьные ссылки или строки "&
" и "<
" соответственно.
Прямоугольная скобка (>
) может быть представлена с помощью строка ">
" и должна, для совместимости, экранировать ">
" или символьная ссылка, когда она появляется в строке "]]>
" в содержании, когда эта строка не маркирует конец CDATA раздел.
Чтобы разрешить значения атрибутов содержать одиночные и двойные кавычки, апостроф или символ с одной кавычкой ('
) могут быть представлены как "'
", а символ двойной кавычки ("
) как ""
".
я прочитал первое, сказав, что
должен быть:
-
<
(<
) должен быть
-
&
(&
) должен быть
может, но должен при появлении ]]>
-
>
(>
) должен быть, если он выглядит как ]]>
И что '
и "
вообще не нужно избегать; если вы не хотите иметь кавычки внутри указанных атрибутов.
Из Спецификация HTML 4.01, представление HTML-документа:
Авторы, желающие поместить символ "<
" в текст, должны использовать "<
" (ASCII десятичный 60), чтобы избежать возможной путаницы с началом тег (открытый разделитель открытого тега).
Аналогичным образом авторы должны использовать ">
" (ASCII decimal 62) в тексте вместо ">
", чтобы избежать проблем с более старыми пользовательские агенты, которые неправильно воспринимают это как конец тега (тег close delimiter), когда он отображается в значениях кавычек.
Авторы должны использовать "&
" (ASCII-децимал 38) вместо "&
", чтобы избежать путаница с началом ссылки на символ (объект ссылочный открытый разделитель). Авторы также должны использовать "&
" в значения атрибутов, поскольку в CDATA допускаются ссылки на символы значения атрибутов.
Некоторые авторы используют ссылку на символ символа ""
" для кодирования экземпляры метки двойной кавычки ("
), поскольку этот символ может быть используется для разграничения значений атрибутов.
HTML намного более правдоподобный по правилам, но звучит так, как будто я должен:
-
<
должен быть с <
-
>
должен быть с >
-
&
должен быть с &
-
"
должен быть с "
и если "
может быть ссылкой на сущность, я также должен заменить '
на &
.
Обновить два
Из HTML5 - Словарь и связанные с ним API для HTML и XHTML:
Экранирование строки (для целей вышеописанного алгоритма) состоит выполнения следующих шагов:
Заменить любое появление символа "&
" строкой "&
".
Заменить любые вхождения символа U + 00A0 NO-BREAK SPACE string "
".
Если алгоритм был вызван в режиме атрибута, замените любой вхождения символа ""
" по строке ""
".
Если алгоритм не был вызван в режиме атрибута, замените любой вхождения символа "<
" по строке "<
" , а любая вхождения символа ">
" по строке ">
".
Что я читаю как HTML:
-
&
&
всегда
-
всегда
-
"
"
, если внутри атрибута
-
<
<
, если в атрибуте не (т.е. атрибуты могут содержать <
)
-
>
>
, если в атрибуте не (т.е. атрибуты могут содержать >
)
Ответы
Ответ 1
Во-первых, вы сравниваете спецификацию HTML 4.01 с HTML 5 шт.. HTML5 тесно связан с XML, чем HTML 4.01 (что почему мы имеем XHTML), поэтому этот ответ будет придерживаться HTML 5 и XML.
Ваши цитируемые ссылки согласуются в следующих пунктах:
-
<
всегда должен быть представлен <
, когда не указывается инструкция обработки
-
>
всегда должен быть представлен >
, если не указывается инструкция обработки
-
&
всегда должен быть представлен &
- кроме, если в
<![CDATA[ ]]>
(что относится только к XML)
Я согласен с этим на 100%. Вы никогда не хотите, чтобы синтаксический анализатор брал литералы для получения инструкций, поэтому он всегда должен кодировать любой символ без пробела (см. Ниже). Хорошие парсеры знают, что все, что содержится в <![CDATA[ ]]>
, не является инструкциями, поэтому кодировка там не нужна.
На практике я никогда не кодирую '
или "
, если
- он отображается внутри значения атрибута (XML или HTML)
- он появляется в тексте тегов XML. (
<tag>"Yoinks!", he said.</tag>
)
Обе спецификации также согласны с этим.
Итак, единственная точка раздора -
(пробел). Единственное упоминание об этом в обеих спецификациях - это попытка сериализации. Если нет, вы всегда должны использовать литерал
(пробел). Если вы не пишете собственный парсер, я не вижу необходимости проводить сериализацию, поэтому это не относится к делу.