セミコロン(;) で終わらないHTML文字実体参照は許されるのか


edvakf
実体参照の最後のセミコロンが要らない場合があるって仕様あるのかな?
edvakf
HTML とテキスト - Entering Passive Mode 「文字実体参照は、& で始まり識別子が続き、 セミコロンか改行で終わる。 セミコロンや改行がない場合は、 識別子として使えない文字が来た時点で終わる。」ほうほう。
北村曉
@ SGMLには省略できる場合の規定があります。
vantguarde
@ @ HTML5だとセミコロンを含めたものと含めてないもの両方がnamed char refsとして定義されてます。
edvakf
@ 面倒ですねー。属性値のダブルクオートの中ではダブルクオートだけエスケープしてればいいと思ってましたが、& も大事ですね。
vantguarde
@ @ すいませんセミコロン無しは全部じゃなくて一部でした><
think49
この挙動は実装依存のはず。/ "文字実体参照は、& で始まり識別子が続き、セミコロンか改行で終わる。セミコロンや改行がない場合は、識別子として使えない文字が来た時点で終わる。"
think49
@ HTML4 も HTML5XML 1.0 と(基本的に)同じ仕様だったと記憶してる。
think49
@ 4.1 文字参照実体参照 - Extensible Markup Language (XML) 1.0 (第五版)
think49
@ 10.1.4 Character references — HTML5 (WHATWG)
think49
@ "The name must be one that is terminated by a U+003B SEMICOLON character (;)."
think49
@ おそらく、デファクトスタンダードであった頃のIE の実装に習って、他のブラウザが追従したのだと思う。
しかし、仕様を正しく実装しているのは Google Chrome の方。
think49
"&" (U+0026 AMPERSAND) と ";" (U+003B SEMICOLON) に注目して読むことにする。
think49
"&" の後にくる文字について。/
"The behavior depends on the identity of the next character (the one immediately after the U+0026 AMPERSAND character):"
think49
LF などの空白文字 "&" が後続すると何も展開されない。/
"Not a character reference. No characters are consumed, and nothing is returned. (This is not an error..."
think49
"#" (U+0023) が後続すると数値参照として扱われる。
think49
それ以外 (Anything else) は「名前付き文字参照」として扱われる。
think49
名前付き文字参照とは のこと。このテーブルにない文字列が後続する場合は何もしない。
think49
"If the character reference is being consumed ...(中略)..., and the last character matched is not a U+003B SEMICOLON character (;), ..."
think49
@ この辺りだな。終端文字が ";" でない時の挙動について書かれている。
think49
@ 終端文字が ";" ではなく、[=0-9A-Za-z] が後続するとき、歴史的な理由で何もしません。
think49
@ 多分、&amphoge のような場合を説明しているのだと思う。これは実体参照として扱われない。
think49
twicli はHTML文字実体参照エスケープしないのね…。"&amphoge" を入力すると実体参照として扱われてしまうので、"&amphoge" と入力する必要がある。
think49
"Otherwise, a character reference is parsed. If the last character matched is not a U+003B SEMICOLON character (;), there is a parse error."
think49
@ さもなければ、文字参照構文解析されます。
もし、終端文字が ";" でないならばパースエラーになります。
think49
@ というわけで、 のHTMLパーサでは ";" を終端文字としない実体参照はパースエラーになると思う。
英文の解読に自信はないので、ツッコミは歓迎します。
think49
正確には「"&" の次に で定義されている文字列が後続するか」で判断しているらしい。
"copy" は定義されているので、&copy は解釈できる。
think49
&amp および &AMP も "&" として解釈できる。
テーブルに存在しない文字が "&" に後続して ";" で終わらない時にパースエラーとなる。