web-dev-qa-db-ja.com

「"」の使用HTMLのエンティティ

いくつかのXHTMLファイルを別の関係者が作成したものを改訂しています。この努力の一環として、私はLinq to XMLを介していくつかの一括編集を行っています。

元のソースXHTMLファイルの一部には、これらのファイル内のテキストノードに " HTMLエンティティ が含まれていることに気付きました。例えば:

<p>Greeting: &quot;Hello, World!&quot;</p>

そして、 XElement.ToString() を介してXHTMLテキストを復元する場合、&quot;エンティティは二重引用符

<p>Greeting: "Hello, World!"</p>

質問:原作者が単純な二重引用符の代わりに&quot;エンティティを使用する動機は何だったのでしょうか?それらのエンティティは、私が十分に理解していない目的を果たしましたか?または、私が疑うように、それらは本当に不要でしたか?

HTML属性内に二重引用符を配置する必要がある場合など、特定のコンテキストでは&quot;が必要になることを理解しています。例えば:

<a href="/images/hello_world.jpg" alt="Greeting: &quot;Hello, World!&quot;">
  Greeting</a>
35
DavidRR

要素コンテンツで&quot;を使用する動機を知ることは不可能であり、不必要ですが、考えられる動機は次のとおりです。HTMLルールの誤解。そのようなコードを生成するソフトウェアの使用(おそらくその作成者が「安全」だと考えたため) &quot;の意味の誤解:多くの人が「スマートな引用符」を生成すると考えているようです(実際の結果を見たことがないようです)。

とにかく、HTMLの要素コンテンツ(XHTMLまたはその他のHTMLバージョン)で&quot;を使用する必要はありません。 HTML仕様には、プレーンな文字 "に特別な意味を割り当てるものは何もありません。

質問が言うように、それは属性値に役割を持っていますが、それらであっても、値が二重引用符が含まれています、例えばalt='Greeting: "Hello, World!"'、または、自然言語テキストのエラーを修正できる場合は、適切な引用符を使用します。 alt="Greeting: “Hello, World!”"

27

理由#1

HTML/XHTMLレンダラーのバグのある/怠yな実装は、正しく実装されたものよりも一般的だった点がありました。何年も前、私はHTML/XHTMLドキュメントの通常のテキストコンテンツでエンコードされていない引用文字を使用した結果、主流のブラウザでレンダリングの問題に定期的に遭遇しました。 HTML仕様ではこれらの文字をテキストコンテンツで使用することを禁止していませんが、仕様に準拠していないブラウザーや他のプロセッサがそれらをより適切に処理できるように、とにかくエンコードするのはかなり標準的な習慣になりました。その結果、多くの「昔の人」はまだこれを再帰的に行うかもしれません。非常に古風なプラットフォームをターゲットにしている場合を除き、現在はおそらく不要ですが、間違っていません。

理由#2

たとえば、HTMLテンプレートにデータベースからの単純な文字列値を入力することによって動的にHTMLコンテンツが生成される場合、生成されたコンテンツに埋め込む前に各値をエンコードする必要があります。いくつかの一般的なサーバー側言語は、この目的のために単一の関数を提供しました。これは、someコンテキストでは無効なmightすべての文字を単にエンコードしましたHTMLドキュメント内。特に、PHPの htmlspecialchars() 関数はそのような例の1つです。 htmlspecialchars()には引用符を無視するオプションの引数がありますが、これらの引数は基本的なテンプレート駆動型システムの作成者によって使用されることはほとんどありませんでした。その結果、すべての「特殊文字」は、発生するコンテキストに関係なく、生成されたHTML内のすべての場所でエンコードされます。繰り返しますが、これは間違いではなく、単に不要です。

7
Lee

私の経験では、作成者がHTMLのルールを理解していなかった文字列ベースのツールによる自動生成の結果である可能性があります。

一部の開発者は、特別なXML指向のツールを使用せずにHTMLを生成する場合、すべてをエスケープする必要がありますというアプローチをとることにより、結果のHTMLが有効であることを確認しようとします。

あなたの例を参照すると、"のすべての出現が&quot;で表される理由は、そのアプローチを使用すると、属性と値の両方でそのような「特殊」文字を安全に使用できるためです。

私が見たもう一つの動機は、人々が「私たちのシンボルが構文の一部ではないことを明示的に示さなければならない」と信じているところです。適切な文字列操作ツールを使用すると、有効なHTMLを作成できます。前の段落を再度参照してください。

有効なメソッドとツールを使用することをお勧めしますが、C#に基づいた大まかな疑似コードを次に示します。

public class HtmlAndXmlWriter
{
    private string Escape(string badString)
    {
        return badString.Replace("&", "&amp;").Replace("\"", "&quot;").Replace("'", "&apos;").Replace(">", "&gt;").Replace("<", "&lt;");

    }

    public string GetHtmlFromOutObject(Object obj)
    {
        return "<div class='type_" + Escape(obj.Type) + "'>" + Escape(obj.Value) + "</div>";    

    }

}

HTMLを生成するためにこのようなアプローチが取られるのは、非常に一般的です。

5
comdiv

他の回答が指摘したように、それはおそらくいくつかのツールによって生成されます。

しかし、もし私がファイルの元の作成者であれば、私の答えはConsistencyです。

属性に二重引用符を入れることが許可されていない場合、なぜ要素のコンテンツに二重引用符を入れるのですか?なぜこれらの仕様には常にこれらの例外的なケースがあるのか​​.. HTML仕様を書かなければならなかったら、私はAll double quotes need to be encodedと言うでしょう。できた.

今日はIn attribute values we need to encode double quotes, except when the attribute value itself is defined by single quotes. In the content of elements, double quotes can be, but are not required to be, encoded.のようなものです(そして、ここでいくつかのケースを忘れています)。

二重引用符は仕様のキーワードであり、エンコードします。仕様のキーワードよりも小さい/大きい、エンコードします。等..

3
Foumpie

属性とテキストノードをエスケープするために単一の関数を使用したためである可能性があります。 &amp;は害を及ぼさないので、なぜコードを複雑にし、2つのエスケープ関数を持ち、それらの間で選択する必要があるため、エラーが発生しやすくなりますか?

0
Timmmm