29

HTMLおよびXMLの特別な予約文字エンティティとは何ですか?

私が持っている情報は言う:

HTML:

  • & (に置き換え&ます)
  • < (に置き換え&lt;ます)
  • > (に置き換え&gt;ます)
  • " (に置き換え&quot;ます)
  • ' (に置き換え&apos;ます)

XML:

  • < (に置き換え&lt;ます)
  • > (に置き換え&gt;ます)
  • & (に置き換え&amp;ます)
  • ' (に置き換え&apos;ます)
  • " (に置き換え&quot;ます)

しかし、私はこれらのどちらに関するドキュメントも見つけることができません。

W3Cは、Extensible Markup Language(XML)1.0(Fifth Edition)で、特定の事前定義されたエンティティ参照について言及しています。ただし、これらのエンティティは事前定義されている(事前定義されているのと同じ方法で&copy;)と書かれています。それらをエスケープする必要があるというわけではありません。

4.6事前定義されたエンティティ

[定義:エンティティと文字の参照は両方とも 、左山かっこ、アンパサンド、およびその他の区切り文字をエスケープするために使用できます。この目的のために、一連の一般的なエンティティ(amp、lt、gt、apos、quot)が指定されます。数値文字参照も使用できます。これらは認識されるとすぐに展開され、文字データとして扱われる必要があるため、数字参照「&#60;」および「&#38;」は、文字データで使用される場合に<および&をエスケープするために使用できます。]

HTMLのエンティティ参照にエスケープする必要がある文字は何ですか?XMLのエンティティ参照にエスケープする必要がある文字は何ですか?


更新

Extensible Markup Language(XML)1.0(Fifth Edition)から:

2.4文字データとマークアップ

アンパサンド文字(&)と左山括弧(<)は 、マークアップ区切り文字として使用する場合、またはコメント、処理命令、またはCDATAセクション内で使用する場合を除いて、リテラル形式で表示してはなりません。他の場所で必要な場合は、数字参照または文字列" "と" "をそれぞれ使用してエスケープする必要があります。&amp;&lt;

直角ブラケット( )は文字列 " ">を使用して表すことができ、互換性のために、コンテンツの文字列 ""に表示される場合は、その文字列が終了をマークしていない場合は、""または文字参照を使用してエスケープする必要があります。 CDATAセクションの。&gt;&gt;]]>

属性値に一重引用符と二重引用符の両方を含めることができるように、アポストロフィまたは一重引用符(')を ""として表し&apos;、二重引用符(")を" &quot;"として表すことができます。

私は前者を次のように読んだ

する必要があります

  • <&lt;)は
  • &&amp;)は

可能性ありますが、]]>

  • >&gt;)として表示される場合は、]]>

そして、それはまったく逃げる必要は'あり"ません。引用符で囲まれた属性内に引用符を入れたい場合を除きます。


HTML 4.01仕様から、HTMLドキュメント表現:

5.3.2文字エンティティ参照

<テキストに「」文字を入れたい場合&lt;は、タグの先頭(開始タグのオープン区切り文字)との混同を避けるために、「」(ASCII 10進数の60)を使用する必要があります。

同様に、作成者は、引用符で囲まれた属性値に表示されるときにタグ(タグクローズ区切り文字)の終わりとしてこれを誤って認識する古いユーザーエージェントの問題を回避するため&gt;に、テキストで「」の代わりに「」(ASCII 10進数62)を使用する必要があります。>

作成者は、文字参照(エンティティ参照のオープン区切り文字)の先頭との混同を避けるために、「」&amp;の代わりに「」(ASCII 10進数38)を使用する必要があります。CDATA属性値内では文字参照が許可されているため、作成者は属性値に&も「」を使用する必要があります。&amp;

一部の作成者は、文字エンティティ参照 " &quot;"を使用して、二重引用符(")のインスタンスをエンコードします。これは、その文字を使用して属性値を区切ることができるためです。

HTMLは、ルールに関してははるかに意地悪ですが、私がすべきだと思われます:

  • <と一緒にいる必要があります&lt;
  • >と一緒にいる必要があります&gt;
  • &と一緒にいる必要があります&amp;
  • "と一緒にいる必要があります&quot;

また"、エンティティ参照になる可能性がある場合は、に置き換える必要があり'ます&amp;


アップデート2

HTML5から-HTMLおよびXHTMLの語彙および関連するAPI :

8.3HTMLフラグメントのシリアル化

文字列のエスケープ(上記のアルゴリズムの目的で)は、次の手順を実行することで構成されます。

&「 」文字の出現箇所を文字列「 」に置き換えます&amp;

U + 00A0NO-BREAKSPACE文字の出現箇所を文字列" &nbsp;"に置き換えます。

"アルゴリズムが属性モードで呼び出された場合は、「 」文字の出現箇所を文字列「 」に置き換えます&quot;

アルゴリズムが属性モードで呼び出されなかった場合は、「」文字の出現箇所を文字列「」に置き換え、「」文字の出現箇所を文字<列「&lt;」に置き換えます。>&gt;

私がHTMLとして読んだもの:

  • &&amp;いつもによって
  • &nbsp;いつもによって
  • "属性内に&quot;ある場合
  • <属性に含まれていない&lt;場合(つまり、属性に含めることができる場合)<
  • >属性に含まれていない&gt;場合(つまり、属性に含めることができる場合)>
4

1 に答える 1

13

まず、 HTML4.01仕様HTML5仕様を比較しています。HTML5はHTML4.01よりもXMLと密接に関連しているため(XHTMLがあるのはそのためです)、この答えはHTML5とXMLに固執します。

引用された参照はすべて、次の点で一貫しています。

  • <&lt;処理命令を示さない場合は、常にで表す必要があります
  • >&gt;処理命令を示さない場合は、常にで表す必要があります
  • &常にで表される必要があります&amp;
  • 内の場合を除く<![CDATA[ ]]>(XMLにのみ適用されます)

私はこれに100%同意します。パーサーがリテラルを命令と間違えたくないので、スペース以外の(以下を参照)文字を常にエンコードすることは確かな考えです。優れたパーサーは、そこに含まれる<![CDATA[ ]]>ものはすべて命令ではないことを知っているので、そこでエンコードする必要はありません。

実際には、私は決してエンコードしない'か、"

  • 属性の値内に表示されます(XMLまたはHTML)
  • XMLタグのテキスト内に表示されます。(<tag>&quot;Yoinks!&quot;, he said.</tag>

どちらの仕様もこれに同意します。

したがって、唯一の論点は(スペース)です。どちらの仕様でも、シリアル化が試行される場合にのみ言及されます。そうでない場合は、常にリテラル(スペース)を使用する必要があります。あなたがあなた自身のパーサーを書いているのでない限り、私はどんな種類のシリアル化もする必要があるとは思わないので、これは重要ではありません。

于 2011-09-02T03:48:38.403 に答える