Какие HTML и XML специальные символы?
Что такое специальные зарезервированные символьные объекты в HTML и XML?
Информация, которую я имею, говорит:
HTML:
&
(заменить&
)<
(заменить<
)>
(заменить>
)"
(заменить"
)'
(заменить'
)
XML:
<
(заменить<
)>
(заменить>
)&
(заменить&
)'
(заменить'
)"
(заменить"
)
Но я не могу найти документацию по любому из них.
W3C упоминает в Extensible Markup Language (XML) 1.0 (пятое издание) некоторые предопределенные ссылки на сущности. Но это говорит о том, что эти объекты предопределены (так же, как ©
предварительно определено); не то чтобы они должны были сбежать
4.6 Предопределенные объекты
[Определение: ссылки на сущности и символы могут использоваться для выхода из левой угловой скобки, амперсанда и других разделителей. Для этого указывается набор общих сущностей (amp, lt, gt, apos, quot). Могут также использоваться числовые ссылки на символы; они раскрываются сразу после распознавания и должны рассматриваться как символьные данные, поэтому числовые ссылки на символы " & # 60;" и " & # 38;" могут использоваться для экранирования <и &, когда они встречаются в символьных данных.]
Какие символы должны быть экранированы в ссылках на сущности в HTML?
Какие символы должны быть экранированы в ссылки на сущности в XML?
Обновление:
Из расширяемого языка разметки (XML) 1.0 (пятое издание):
2.4 Символьные данные и разметка
Символ амперсанда (
&
) и левая угловая скобка (<
) не должны появляться в их буквальной форме, за исключением случаев, когда они используются в качестве разделителей разметки или в комментариях, инструкциях обработки или разделе CDATA.
Если они нужны где-то еще, их нужно экранировать, используя либо числовые ссылки на символы, либо строки "&
" а также "<
соответственно.Правая угловая скобка (
>
) может быть представлен с помощью строки ">
msgstr "и для совместимости должен быть экранирован, используя либо">
"или ссылка на символ, когда он появляется в строке"]]>
"в содержании, когда эта строка не отмечает конец раздела CDATA.Чтобы значения атрибута могли содержать как одинарные, так и двойные кавычки, апостроф или одинарные кавычки (
'
) может быть представлен как'
"и двойной кавычки ("
) как ""
".
я прочитал первый, который говорит, что
должно быть:
<
(<
) должно быть&
(&
) должно быть
может, но должен при появлении как ]]>
>
(>
) должен быть, если отображается как]]>
И это '
а также "
не нужно вообще убегать; если вы не хотите иметь кавычки внутри цитируемых атрибутов.
Из спецификации HTML 4.01, представление документа HTML:
5.3.2 Ссылки на символьные объекты
Авторы, желающие поставить
<
"символ в тексте должен использовать"<
Msgstr " (ASCII decimal 60), чтобы избежать возможной путаницы с началом тега (начальный тег открытого разделителя).Точно так же авторы должны использовать
>
"(ASCII десятичное 62) в тексте вместо">
msgstr "чтобы избежать проблем со старыми пользовательскими агентами, которые неправильно воспринимают это как конец тега (разделитель тегов), когда он появляется в значениях атрибута в кавычках.Авторы должны использовать
&
"(ASCII десятичное 38) вместо"&
"Во избежание путаницы с началом ссылки на символ (открытый разделитель ссылки на сущность). Авторы также должны использовать"&
msgstr "в значениях атрибутов, поскольку в значениях атрибутов CDATA допустимы ссылки на символы.Некоторые авторы используют ссылку на сущность персонажа
"
"для кодирования экземпляров двойной кавычки ("
), поскольку этот символ может использоваться для разделения значений атрибутов.
В правилах HTML гораздо слабее, но, похоже, я должен:
<
должно быть с<
>
должно быть с>
&
должно быть с&
"
должно быть с"
и если "
может быть ссылкой на сущность, я также должен заменить '
с &
,
Обновление Два
Из HTML5 - словарь и связанные API для HTML и XHTML:
8.3 Сериализация фрагментов HTML
Экранирование строки (для целей алгоритма выше) состоит из следующих шагов:
Заменить любое вхождение "
&
"символ за строкой"&
".Заменить все вхождения символа U+00A0 NO-BREAK SPACE на строку "
".Если алгоритм был вызван в режиме атрибута, замените все вхождения "
"
"символ за строкой""
".Если алгоритм не был вызван в режиме атрибута, замените все вхождения "
<
"символ за строкой"<
"и любые случаи">
"символ за строкой">
".
Который я читаю как 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>
)
Обе спецификации также согласны с этим.
Таким образом, единственным предметом спора является (пространство). Единственное упоминание об этом в любой спецификации - это попытка сериализации. Когда нет, вы всегда должны использовать буквальный
(пространство). Если вы не пишете свой собственный парсер, я не вижу необходимости в какой-либо сериализации, так что это не относится к делу.