30

私は最近 (これらの 質問から)、ある時点で、hrefパラメーターでアンパサンドをエンコードすることをお勧めすることを知りました。つまり、次のように書く代わりに:

<a href="somepage.html?x=1&y=2">...</a>

次のように書く必要があります。

<a href="somepage.html?x=1&amp;y=2">...</a>

どうやら、前者の例はうまくいかないはずですが、ブラウザのエラー回復はうまくいくことを意味します。

これは HTML5 にも当てはまりますか?

厳しい XHTML 要件の時代は過ぎ去りました。これは XHTML の厳密な処理の要件でしたか、それとも Web 開発者として認識しておくべきことでしょうか?

4

1 に答える 1

40

W3C Differences Pageから引用された、HTML5 と HTML4 の違いの 1 つが次のとおりであることは事実です。

アンパサンド (&) は、HTML4 と比較してより多くの場合、エスケープされないままにすることができます。

実際、HTML5 の仕様では、文字を消費 (および解釈) することの意味を決定する実際のアルゴリズムについて詳しく説明しています。

特に、 HTML5 仕様の第 8 章の文字参照のトークン化に関するセクションでは、属性内にいると、アンパサンド文字の後に次の文字が続くことがわかります。

  • タブ、LF、FF、スペース<、、、&EOF、または追加の許可された文字 (属性値が引用符で囲まれている場合は or 、引用されて"いない場合は a) ===> アンパサンドは単なるアンパサンドです。心配する必要はありません。'>
  • 番号記号 ===> の場合、HTML5 トークナイザーは多くの手順を実行して、数字エンティティ参照があるかどうかを判断しますが、この場合、解析エラーが発生することに注意してください(仕様をお読みください)
  • その他の文字 ===> パーサーは名前付きの文字参照を見つけようとします&notin;

あなたの例には次のものがあるので、最後のケースはあなたにとって興味深いものです:

<a href="somepage.html?x=1&y=2">...</a>

あなたは文字列を持っています

  • アンパサンド
  • ラテン小文字 Y
  • 等号

yこれは、名前付きエンティティ参照ではないため、ケースに関連する HTML5 仕様の一部です。

一致するものがない場合、文字は消費されず、何も返されません。この場合、U+0026 AMPERSAND 文字 (&) の後の文字が、1 つ以上の英数字 ASCII 文字のシーケンスとそれに続く U+003B セミコロン文字 (;) で構成されている場合、これは解析エラーです。

そこにはセミコロンがないため、解析エラーはありません。

代わりに、

<a href="somepage.html?x=1&eacute=2">...</a>

HTML の名前付きエンティティ参照である&eacute; ため、これは異なります。この場合、次のルールが適用されます。

文字参照が属性の一部として使用され、最後に一致した文字が「;」ではない場合。(U+003B) 文字であり、次の文字が "=" (U+003D) 文字または英数字の ASCII 文字のいずれかである場合、歴史的な理由から、U+0026 AMPERSAND 文字 (& ) は未使用でなければならず、何も返されません。ただし、この次の文字が実際に「=」(U+003D) 文字である場合、これは解析エラーです。これらの場合、一部の従来のユーザー エージェントがマークアップを誤って解釈するためです。

レガシー=ブラウザが混乱する可能性があるため、エラーになります。

HTML5 仕様では、「このアンパサンドは文字エンティティ参照を開始していないため、ここには参照がありません」と長々と述べているように見えますが、名前付き参照 (たとえば、、、、) を持つ URL に遭遇する可能性があるという事実にもisinかかわらずpart、これにより解析エラーが発生する場合は、IMHOの方が良いでしょう。しかしもちろん、何をすべきかではなく、属性の制限が緩和されたかどうかを尋ねただけであり、緩和されたようです。sumsub

バリデーターができることを見るのは興味深いでしょう。

于 2013-10-18T05:20:04.850 に答える