Почему & amp; написанный в html like amp ;? [Дубликат]

Компиляция программы на C ++ выполняется в несколько этапов, как указано в 2.2 (кредиты для Кейта Томпсона для ссылки) :

Превалирование среди правил синтаксиса

  1. Физические символы исходного файла сопоставляются в соответствии с реализацией в соответствии с базовым набором символов источника (ввод символов новой строки для индикаторов конца строки) при необходимости. [SNIP]
  2. Каждый экземпляр символа обратной косой черты (\), за которым сразу следует символ новой строки, удаляется, сплайсируя физические исходные строки для формирования логических строк источника. [SNIP]
  3. Исходный файл разбивается на токены предварительной обработки (2.5) и последовательности символов пробела (включая комментарии). [SNIP]
  4. Выполнены предпроцессорные директивы, макро-вызовы разворачиваются и выполняются операторные выражения _Pragma. [SNIP]
  5. Каждый элемент набора символов в символьном литерале или строковый литерал, а также каждая escape-последовательность и универсальное имя-символа в символьном литерале или не- -raw строковый литерал, преобразуется в соответствующий член набора символов выполнения; [SNIP]
  6. Соединительные маркеры литералов строки объединены.
  7. Символы пробела, разделяющие токены, уже не являются значимыми. Каждый токен предварительной обработки преобразуется в токен. (2.7). Результирующие маркеры синтаксически и семантически анализируются и переводятся как единица перевода. [SNIP]
  8. Устанавливаемые единицы перевода и единицы экземпляра объединяются следующим образом: [SNIP]
  9. Все ссылки на внешние сущности решена. Компоненты библиотеки связаны для удовлетворения внешних ссылок на объекты, не определенные в текущем переводе. Весь такой переводчик выводится в образ программы, который содержит информацию, необходимую для выполнения в среде выполнения. (акцент мой)

[footnote] Реализации должны вести себя так, как если бы эти отдельные фазы происходили, хотя на практике различные фазы могли быть свернуты вместе.

Указанные ошибки возникают на этом последнем этапе компиляции, чаще всего называемом связыванием. Это в основном означает, что вы собрали кучу файлов реализации в объектные файлы или библиотеки, и теперь вы хотите заставить их работать вместе.

Скажите, что вы определили символ a в a.cpp. Теперь b.cpp объявил этот символ и использовал его. Перед связыванием он просто предполагает, что этот символ был определен где-то , но он пока не заботится о том, где. Фаза связывания отвечает за поиск символа и правильную привязку его к b.cpp (ну, собственно, к объекту или библиотеке, которая его использует).

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

Подобные механизмы существуют для других компиляторов / платформ.

Общие сообщения об ошибках: error LNK2001, error LNK1120, error LNK2019 для Microsoft Visual Studio и undefined reference to symbolName для GCC.

Код:

struct X
{
   virtual void foo();
};
struct Y : X
{
   void foo() {}
};
struct A
{
   virtual ~A() = 0;
};
struct B: A
{
   virtual ~B(){}
};
extern int x;
void foo();
int main()
{
   x = 0;
   foo();
   Y y;
   B b;
}

генерирует следующие ошибки с GCC:

/home/AbiSfw/ccvvuHoX.o: In function `main':
prog.cpp:(.text+0x10): undefined reference to `x'
prog.cpp:(.text+0x19): undefined reference to `foo()'
prog.cpp:(.text+0x2d): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o: In function `B::~B()':
prog.cpp:(.text._ZN1BD1Ev[B::~B()]+0xb): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o: In function `B::~B()':
prog.cpp:(.text._ZN1BD0Ev[B::~B()]+0x12): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o:(.rodata._ZTI1Y[typeinfo for Y]+0x8): undefined reference to `typeinfo for X'
/home/AbiSfw/ccvvuHoX.o:(.rodata._ZTI1B[typeinfo for B]+0x8): undefined reference to `typeinfo for A'
collect2: ld returned 1 exit status

и аналогичные ошибки с Microsoft Visual Studio:

1>test2.obj : error LNK2001: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ)
1>test2.obj : error LNK2001: unresolved external symbol "int x" (?x@@3HA)
1>test2.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall A::~A(void)" (??1A@@UAE@XZ)
1>test2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall X::foo(void)" (?foo@X@@UAEXXZ)
1>...\test2.exe : fatal error LNK1120: 4 unresolved externals

. Общие причины включают в себя:

175
задан Richard J. Ross III 7 August 2013 в 06:15
поделиться

17 ответов

Не могли бы вы показать нам, каков ваш title на самом деле? Когда я отправляю

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>

в http://validator.w3.org/ - явно прося его использовать экспериментальный режим HTML 5 - у него нет жалоб на & s ...

5
ответ дан AakashM 3 September 2018 в 15:42
поделиться

, если в html используется &, вам следует избегать его

Если & используется в строках javascript, например. alert('This & that'); или document.href вам не нужно использовать его.

Если вы используете document.write, вы должны использовать его, например. document.write(<p>this &amp; that</p>)

1
ответ дан Alex 3 September 2018 в 15:42
поделиться

Ну, если это происходит от пользовательского ввода, то абсолютно да, по понятным причинам. Подумайте, не сделал ли это этот сайт: название этого вопроса будет отображаться, как мне действительно нужно кодировать «& amp;» как «& amp;»?

Если это что-то вроде echo '<title>Dolce & Gabbana</title>';, тогда, строго говоря, вам это не нужно. Было бы лучше, но если вы этого не сделаете, пользователь не заметит разницы.

5
ответ дан Andreas Bonini 3 September 2018 в 15:42
поделиться

Пару лет назад мы получили сообщение о том, что одно из наших веб-приложений неправильно отображалось в Firefox. Оказалось, что страница содержала тег, который выглядел как

<div style="..." ... style="...">

. Когда сталкивается с повторяющимся атрибутом стиля, IE объединяет оба стиля, в то время как Firefox использует только один из них, следовательно, различное поведение. Я изменил тег на

<div style="...; ..." ...>

и, конечно же, исправил проблему! Мораль этой истории заключается в том, что браузеры имеют более последовательную обработку допустимого HTML, чем недействительный HTML. Итак, исправьте свою проклятую разметку! (Или используйте HTML Tidy, чтобы исправить его.)

2
ответ дан dan04 3 September 2018 в 15:42
поделиться

Если пользователь передает его вам или он закроется в URL-адресе, вам нужно его избежать.

Если он отображается в статическом тексте на странице? Все браузеры получат это право в любом случае, вы не беспокоитесь об этом, так как он будет работать.

3
ответ дан Dean J 3 September 2018 в 15:42
поделиться

Да. Так же, как и ошибка, в HTML атрибуты #PCDATA означают, что они разбираются. Это означает, что вы можете использовать символьные сущности в атрибутах. Использование & само по себе неверно, и если не для мягких браузеров и того факта, что это HTML не XHTML, это нарушит синтаксический анализ. Просто избегайте его как &amp;, и все будет в порядке.

HTML5 позволяет оставить его незанятым, но только тогда, когда последующие данные не будут выглядеть как действительная символьная ссылка. Однако лучше просто избегать всех экземпляров этого символа, чем беспокоиться о том, какие из них должны быть, а какие не нужны.

Помните об этом; если вы не избегаете & amp; to & amp ;, это достаточно плохо для данных, которые вы создаете (где код может быть очень недействительным), вы также можете не избегать разделителей тегов, что является огромной проблемой для данных, предоставленных пользователем, что вполне может привести к к HTML и инъекции скриптов, хищению файлов cookie и другим эксплойтам.

Пожалуйста, просто избегайте кода. Это сэкономит вам массу неприятностей в будущем.

127
ответ дан Delan Azabani 3 September 2018 в 15:42
поделиться

Да, вы должны попытаться использовать действительный код, если это возможно.

Большинство браузеров будут тихо исправлять эту ошибку, но есть проблема с использованием обработки ошибок в браузерах. Существует не стандарт для обработки неправильного кода, поэтому каждый поставщик браузера пытается выяснить, что делать с каждой ошибкой, и результаты могут отличаться.

Некоторые примеры, когда браузеры могут иначе вы поместите элементы внутри таблицы, но вне ячеек таблицы, или если вы вставляете ссылки друг в друга.

Для вашего конкретного примера это вряд ли вызовет какие-либо проблемы, но исправление ошибок в браузере может привести к тому, что браузер переключится с режима, совместимого со стандартами, на режим quirks, который может полностью раскрыть ваш макет.

Итак, вы должны исправить ошибки, подобные этому в коде, если не для чего-либо еще, так что чтобы сохранить список ошибок в валидаторе коротким, чтобы выявить более серьезные проблемы.

2
ответ дан Guffa 3 September 2018 в 15:42
поделиться

В HTML a & отмечает начало ссылки, либо из ссылки на символ , либо ссылки на сущность . С этой точки анализатор ожидает либо #, обозначающего ссылку на символ, либо имя объекта, обозначающее ссылку на сущность, и за ним следует ;. Это нормальное поведение.

Но если за именем ссылки или просто с обратным открытием & следует пробел или другие разделители, такие как ", ', <, > , &, окончание ; и даже ссылка для представления простой & могут быть опущены:

<p title="&amp;">foo &amp; bar</p>
<p title="&amp">foo &amp bar</p>
<p title="&">foo & bar</p>

Только в этих случаях окончание ; или даже сама ссылка может (по крайней мере, в HTML 4). Я думаю, что HTML 5 требует окончания ;.

Но спецификация рекомендует всегда использовать ссылку, такую ​​как ссылка на символ &#38; или ссылку на объект &amp;, чтобы избежать путаница:

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

3
ответ дан Gumbo 3 September 2018 в 15:42
поделиться

Если вы действительно говорите о статическом тексте

<title>Foo & Bar</title>

, хранящемся в каком-то файле на жестком диске и обслуживаемом непосредственно сервером, тогда да: возможно, это не нужно экранировать .

Однако, поскольку в настоящее время очень имеется небольшой контент HTML, который полностью статичен, я добавлю следующий отказ от ответственности, предполагающий, что содержимое HTML создается из какого-либо другого источника (базы данных содержимое, пользовательский ввод, результат вызова веб-службы, результат устаревшего API, ...):

Если вы не избежите простого &, то, скорее всего, вы также не избежите &amp; или &nbsp; или <b> или <script src="http://attacker.com/evil.js"> или любой другой недопустимый текст. Это означало бы, что вы в лучшем случае неправильно отображаете свой контент и, скорее всего, подозреваете атак XSS .

Другими словами: когда вы уже проверяете и избегаете другого Проблемные случаи, то почти нет причин оставлять не полностью полностью сломанные, но все еще несколько-одичалые автономные & amp; неэкранированный.

0
ответ дан Joachim Sauer 3 September 2018 в 15:42
поделиться

Я тщательно изучил это и написал о моих выводах здесь: http://mathiasbynens.be/notes/ambiguous-ampersands

Я также создал онлайн-инструмент , который вы можете использовать для проверки вашей разметки для неоднозначных амперсандов или ссылок на символы, которые не заканчиваются точкой с запятой, оба из которых являются недопустимыми. (В настоящее время HTML-валидатор делает это правильно.)

http://i.imgur.com/cLssU.png [/g2]

29
ответ дан Mathias Bynens 3 September 2018 в 15:42
поделиться

Ссылка имеет довольно хороший пример того, когда и почему вам может потребоваться сбежать от & до &amp;

https://jsfiddle.net/vh2h7usk/1/

. Интересно, что мне пришлось скрыться от персонажа, чтобы правильно представить его в моем ответе. Если бы я использовал встроенную опцию sample sample (с панели ответов), я могу просто ввести &amp;, и она появится так, как должна. Но если бы мне пришлось вручную использовать элемент <code></code>, я должен был убежать, чтобы правильно его представить:)

-1
ответ дан mathin 3 September 2018 в 15:42
поделиться

Правила HTML5 отличаются от HTML4. Это не требуется в HTML5 - если амперсанд не выглядит так, он запускает имя параметра. «& amp; copy = 2» по-прежнему является проблемой, например, поскольку & amp; copy; является символом авторского права.

Однако мне кажется, что труднее решить кодировать или не кодировать в зависимости от следующего текста. Поэтому самый простой путь - это, вероятно, все время кодировать.

18
ответ дан Matthew Wilson 3 September 2018 в 15:42
поделиться

Я проверял, почему URL-адрес URL-адреса нужно экранировать, поэтому попробовал его в https://validator.w3.org . Объяснение довольно приятно. В нем подчеркивается, что даже URL-адреса должны быть экранированы. [PS: Я предполагаю, что он не будет отменен, когда его потреблят с потребностью URL &. Может ли кто-нибудь уточнить?]

<img alt="" src="foo?bar=qut&qux=fop" />

Ссылка на объект была найдена в документе, но эта ссылка не указана. Часто это происходит из-за неправильной орфографии имени ссылки, неэнкодированных амперсандов или оставления конечной точки с запятой (;). Наиболее распространенной причиной этой ошибки являются некодированные амперсанды в URL-адресах, как описано в WDG в «Амперсандах в URL-адресах». Ссылки на Entity начинаются с амперсанда (& amp;) и заканчиваются точкой с запятой (;). Если вы хотите использовать буквальный амперсанд в своем документе, вы должны закодировать его как «& amp;» (даже внутри URL!). Будьте осторожны, чтобы закончить ссылки на сущности с точкой с запятой или ссылкой на сущность, можно интерпретировать в связи со следующим текстом. Также имейте в виду, что ссылки на именованные сущности чувствительны к регистру; & Aelig; и & aelig; это разные персонажи. Если эта ошибка появляется в некоторой разметке, сгенерированной кодом обработки сеанса PHP, в этой статье есть объяснения и решения вашей проблемы.

2
ответ дан Nishant 3 September 2018 в 15:42
поделиться

не уверен, что это полезно для всех ... Я боролся с этим некоторое время ... вот славное регулярное выражение, которое вы можете использовать, чтобы исправить все ваши ссылки, javascript, контент. Мне пришлось иметь дело с тонной частью устаревшего контента, который никто не хотел исправлять.

Добавьте это к вашему переопределению Render на своей главной странице или в управлении:

Пожалуйста, не пламени меня помещая это в неправильное место:

// remove the & from href="blaw?a=b&b=c" and replace with &amp; 
//in urls - this corrects any unencoded & not just those in URL's
// this match will also ignore any matches it finds within <script> blocks AND
// it will also ignore the matches where the link includes a javascript command like
// <a href="javascript:alert{'& & &'}">blaw</a>
html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\\k<outerquote>|[>]).)*)\\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\\d+);)(?!(?>(?:(?!<script|\\/script>).)*)\\/script>)", "&amp;", RegexOptions.Singleline | RegexOptions.IgnoreCase);
-1
ответ дан Richard Dufour 3 September 2018 в 15:42
поделиться

Валидация в стороне, факт остается фактом: кодирование определенных символов важно для HTML-документа, чтобы он мог корректно и безопасно отображаться как веб-страница.

Кодирование & как &amp; при любых обстоятельствах , для меня легче управлять жизнью, уменьшая вероятность ошибок и сбоев.

Сравните следующее: что проще?

  1. Напиши некоторый контент, который включает символы амперсанда.
  2. Кодировать их все.
  3. / g9]

    Методология 2

    (с зерном соли, пожалуйста;))

    1. Напишите некоторый контент, который включает символы амперсанда.
    2. В каждом конкретном случае посмотрите на каждый амперсанд. Определите, если: Он изолирован и, как таковой, однозначно амперсанд. например. volt & amp & nbsp;> В этом случае не надо его кодировать. Он не изолирован, но вы чувствуете, что он, тем не менее, недвусмыслен, поскольку результирующий объект не существует и никогда не будет существовать, поскольку список сущностей никогда не может эволюционировать. например amp&volt & nbsp;> В этом случае не надо его кодировать. Он не изолирован и неоднозначен. например. volt&amp & nbsp;> Кодировать его.

    ??

51
ответ дан Richard JP Le Guen 3 September 2018 в 15:42
поделиться

Я думаю, что это превратилось в вопрос о том, «зачем следовать спецификации, когда браузеру все равно». Вот мой обобщенный ответ:

Стандарты не являются «настоящими». вещь. Они являются «будущими». вещь. Если мы, разработчики, следуем веб-стандартам, то поставщики браузеров с большей вероятностью правильно реализуют эти стандарты, и мы приближаемся к полностью интероперабельному веб-сайту, где CSS-хаки, обнаружение функций и обнаружение браузера не нужны. Где нам не нужно выяснять, почему наши макеты разбиваются в определенном браузере или как обойти это.

В частности, если HTML5 не требует использования & amp; amp; в вашей конкретной ситуации, и вы используете доктрину HTML5 (а также ожидаете, что ваши пользователи будут использовать HTML5-совместимые браузеры), тогда нет причин для этого.

13
ответ дан Ryan Kinal 3 September 2018 в 15:42
поделиться

Это зависит от вероятности того, что точка с запятой заканчивается рядом с вашим &, заставляя ее отображать что-то совсем другое.

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

Для вашего собственного статического html, конечно, вы можете пропустить его, но это так просто, чтобы включить правильное экранирование, что нет никаких оснований, чтобы его избежать.

1
ответ дан yoniLavi 3 September 2018 в 15:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: