* 仕様書

[REFS[
- [6] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#named-character-references>
- [7] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#character-references>
- [11] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#consume-a-character-reference>
]REFS]

* HTML における構文

[8] 最初の1文字は、 [CODE[[[&]]]] です [SRC[>>7]]。

[9] 最後の1文字は、 [CODE[[[;]]]] でなければなりません [SRC[>>7]]。

[10] [CODE[[[;]]]] 以外で終わるものも定義されています [SRC[>>6]] が、
互換性のためのものですから、[[利用者エージェント]]は実装しなければなりませんが、
[[著者]]は使ってはなりません。

* HTML における構文解析

[35] [[HTML]] では[[名前付き文字参照]]は、次のように[[構文解析]]されます [SRC[>>11]]。

[FIG(steps)[
= [12] [[名前付き文字参照]]の表から、入力と一致する最長のものを探します。
= [13] 一致するものがなかった場合、
== [14] 入力が [CODE[[[&]]]] の後に1文字以上の[[ASCII英数字]]の後に [CODE[[[;]]]] なら、
=== [36] [[構文解析エラー]]です。
=== [15] これは[[名前付き文字参照]]ではありません。
== [37] それ以外なら、
=== [38] これは[[名前付き文字参照]]ではありません。
= [16] 一致するものがあった場合、
== [17] 属性値の処理中である場合、
=== [18] 一致した最後が [CODE[[[;]]]] 以外の場合、
==== [19] 一致した文字の次が[[ASCII英数字]]の場合、
===== [21] これは[[名前付き文字参照]]ではありません。
==== [20] 一致した文字の次が [CODE[[[=]]]] の場合、
===== [23] [[構文解析エラー]]です。
===== [22] これは[[名前付き文字参照]]ではありません。
==== [31] それ以外の場合、
===== [25] [[構文解析エラー]]です。
===== [26] これは[[名前付き文字参照]]です。
=== [32] 一致した最後が [CODE[[[;]]]] の場合、
==== [33] これは[[名前付き文字参照]]です。
== [24] 内容の処理中である場合、
=== [27] 一致した最後が [CODE[[[;]]]] 以外の場合、
==== [29] [[構文解析エラー]]です。
==== [28] これは[[名前付き文字参照]]です。
=== [30] 一致した最後が [CODE[[[;]]]] の場合、
==== [34] これは[[名前付き文字参照]]です。
]FIG]

* SGML における文字実体

[80] 任意の1[[文字]] (又はそれに準ずるとみなされる文字列) である[[実体]]。 Character entity。

[81] 主として、[[鍵盤]]から直接入力出来ない文字とか、[[文書文字集合]]に含まれない文字を[[実体参照]]として容易に入力するために使用する。

[82] 文字実体への[[参照]]を特に[[文字実体参照]]ということがあります。

[83] 
[CITE[Character Entities: An XML Core WG View]] <http://www.w3.org/XML/Core/2002/10/charents-20021023>




* SGML における名前付き文字参照

[1] [DFN[[[名前指定文字参照]]]]は、区切られた機能名からなる[[文字参照]]。
Named character reference。 ([[JIS X 4151]]‐1992 3. (200))

[2] 例えば [SAMP(SGML)[&#[[RE]];]]
で、[[機能文字]] [CODE(SGML)[RE]] ([[記録終了]])
を参照できます。
形としては[[名前指定実体参照]]とよく似ていますが、
機能的には異なるので注意が必要です。

[CODE(SGML)[RE]] = [CODE(char)[0x0D]]
で、 [SAMP(SGML)[<![[ENTITY]] RE "&#x0D;">]]
と定義していたとします。
こうすると、 [CODE(SGML)[&#RE;]] (名前指定文字参照)
と [CODE(SGML)[&RE;]] (名前指定実体参照)
はどちらも [CODE(char)[0x0D]] を表しますが、
前者は記録終了としての解釈がなされるのに対し、
後者は単なる文字として扱われます。

普段は特に意識する必要はありませんが、
たまに違った振る舞いをする場面が出てくるので注意が必要です。
まあ素人はおとなしく名前指定実体参照を使ってろってことですな。

[4] >>2 但し、[[区切子]]又は[[文脈依存区切子]]が複数文字ある場合には、2文字目以降には名前指定文字参照は使えないのだそうです。 (8.6 参照。)

[3] ちなみに [[XML]] では名前指定文字参照は使えません。

[5] 素の SGML で[[十六進数文字参照]]を使いたい時に強引に合法化することが・・・できるのかなあ。

* メモ

[41] [[SGML]] では一般に''曖昧でない場合''最後の [CODE(SGML)[;]] を省略できます。だから例えば [[HTML]] で [CODE(HTML)[&lt</p>]] という文書断片は[[妥当]]です。

[42] しかし、曖昧である場合、例えば [CODE(HTML)[&ltABCDEF]] は[[不当]]です。

[43] ところが、 [[ClassicMozilla]] や [[WinIE]] のような「伝統的」[[WWWブラウザ]]は、こういうのまで多めに見て頑張って [SAMP[<ABCDEF]] と解釈してくれたりします。

[45] しかし SGML parser にはこのような芸当は出来ませんし、新しい [[Gecko]] [[Mozilla]] は >>42 のような場合著者が「意図」したように''解釈しません''。

[46] なお、 [[XML]] ではこの [CODE(XML)[;]] を省略することは出来ません。

[47] たまに混同されますが、[[文字参照]] ([[数値文字参照]]や[[名前文字参照]]) とは別物です。

[48] [[文字実体]]を[[参照]]する[[実体参照]]。 Character entity reference。

[49] 文字実体参照は普通は[[一般実体参照]]です。理論上は[[引数実体参照]]である文字実体参照もあり得ますが、そんなのには大して用途も無いので、普通は使いません。

[50] 文字実体参照というのは意味上・機能上の種別ですから、見かけ上は他の実体参照と区別がつきません。

[51] 文字実体は普通、便宜のために[[文字実体集合]]などとしてまとめて定義されます。

[44] >>43 Classic Mozilla はそうじゃないかもしれん。少なくても [[NC]] 4.01 はこれを「意図したように」 ([SAMP(HTML)[<ABCDEF]]) 解釈せずに、正しく ([SAMP(HTML)[&ltABCDEF]]) 解釈する。

[52] [[タグ講座]]とかには [SAMP(HTML)[&ltHTML>]] とかがいっぱいでてきてきもい。

[53] ''Character References/Entities CHECK!'' <http://www.kmc.gr.jp/~ranran/browsers/entities.html>

[54] [CITE[HTML4.0 で使える文字実体参照の表の利用上の注意《「の」の連続》の検証《更に「の」の連続》]] 
<http://homepage1.nifty.com/VET06031/memo/charrefhelp2.html>

[55] [CITE[Bug 28823 - &QUOT; &AMP; &LT; &GT; and &COPY; are not parsed correctly]] <https://bugzilla.mozilla.org/show_bug.cgi?id=28823>

[56] [[HTML 4]]的には[[文字実体参照]]の[[名前]]は[[大文字]]・[[小文字]]の区別を''します''が、一部の[[利用者エージェント]]は区別をしなかったり、一部の[[文字実体参照]]について標準とは異なる[[大文字]]・[[小文字]]の組合わせを認めていたりします。という話とテスト。

[57] >>56 [[WinIE 6]]と[[Firefox 1.5]]の両者が対応している5種類の[[大文字]]の[[文字実体参照]]は、
[[HTML 5]]の[[HTML]]構文解析モードで[[小文字]]版と同じ意味に解釈すると規定されました。今のところ[[Firefox]]が対応していない (無効にされた?)
[CODE(HTML)@en[&TRADE;]]は含まれていません。

;; [[HTML 5]] ([[作業中]])
<http://www.whatwg.org/specs/web-apps/current-work/#entities1>

([TIME[2006-01-03 04:34:12 +00:00]])

[58] >>57 [[WorldWideWeb]]で最初に[CODE(HTML)@en[&[[lt]];]]など4種類が実装された時
(1992年?) には、[[大文字]]と[[小文字]]を区別していなかったみたいです。

[59] [[HTML]]や[[XML]]で定義済みの[[文字実体参照]]は、
[[DOM]][[木]]を作る際展開されて、[[参照]]されていない[[文字データ]]や[[文字参照]]そのものとも区別が付かなくなります。
([CODE(DOMi)@en[[[EntityReference]]]][[節点]]は作られません。)

;; 仕様書: 
= [[DOM 1]] [CSECTION@en[Entities and the DOM Core]]
<IW:DOM1:"introduction.html#ID-E7C30824">
= [[DOM 2]] [CSECTION@en[Entities and the DOM Core]]
<IW:DOM2:"Core/introduction.html#ID-E7C30824">
= [[DOM 3]] [CSECTION@en[Entities and the DOM Core]]
<IW:DOM3:"Core/introduction.html#ID-E7C30824">

[60] >>59 元々[[文字実体参照]]だったもの (あるいは[[文字]]そのものや[[文字参照]]だったもの) から作った[[DOM]] (部分) [[木]]を[[直列化]]した時に、
元と同じ[[文字列]]に戻るか、別のものになるかはわかりません。
もし [WEAK[([[DOM]] [[API]]からアクセスできなくても、内部情報として)]]
元の表現がわかるように実装されていれば、元通りに戻るはずです。
しかし、そう実装しなければならないわけではありませんし、
効率等の問題があるので、多くの実装ではそのような余分な情報を保持していないと考えられます。

[61] [[Jane Doe]][[レンダリング円陣]]には不具合があって、[CODE(HTML)@em[&sect]]を[CODE(char)[§]]にしてしまうようです (要検証)。
([TIME[2006-03-18 05:21:52 +00:00]])

[62] [[WinIE]] 6 では、
[PRE(HTML example code)[
<p>&section</p>
]PRE]

は
[PRE(HTML example code)[
<p>§ion</p>
]PRE]

と同じ [[DOM]] になりますが、
[PRE(HTML example code)[
<p title="&section">
]PRE]

は
[PRE(HTML example code)[
<p title="&amp;section">
]PRE]

と同じ [[DOM]] になります。

([[名無しさん]] [WEAK[2007-01-06 12:46:38 +00:00]])

[63] [[Firefox]] 1.5 と [[Opera]] 9 はどちらも 
[CODE(HTML)@en[&amp;section]] と解釈します。

[64] [[Emacs/W3]]: [CITE[Repository - markup - w3: w3/lisp/w3-vars.el]] ([CODE[2007-01-08 19:00:00 +09:00]] 版) <http://cvs.savannah.gnu.org/viewcvs/w3/lisp/w3-vars.el?rev=1.8&root=w3&view=auto>

>
[PRE[
    (lcub        . 123)
>
    (rcub        . 125)
>
    (frac56      . "5/6")
    (frac16      . "1/6")
    (frac45      . "4/5")
    (frac35      . "3/5")
    (frac25      . "2/5")
    (frac15      . "1/5")
    (frac23      . "2/3")
    (frac13      . "1/3")
    (frac78      . "7/8")
    (frac58      . "5/8")
    (frac38      . "3/8")
    (frac18      . "1/8")
>
    (agr         . "alpha")
]PRE]

[65] [CITE[Bug 289938 &#8211; Should use real astral chars (not PUA) for math chars outside the Basic Multilingual Plane]] ([CODE[2007-01-24 21:48:28 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=289938>
([[名無しさん]] [WEAK[2007-01-24 12:52:34 +00:00]])

[66] [CITE@en[HTML Entity Character Lookup &#8250; Left Logic]] ([[Left Logic]] 著, [CODE[2007-06-15 20:53:42 +09:00]] 版) <http://leftlogic.com/lounge/articles/entity-lookup/>
([[名無しさん]] [WEAK[2007-06-15 12:03:31 +00:00]])

[67] [CITE[EMail Msg <9307122305.AA40433@stat1.cc.ukans.edu>]] ([CODE[2007-07-01 04:58:23 +09:00]] 版) <http://ksi.cpsc.ucalgary.ca/archives/WWW-TALK/www-talk-1993q3.messages/117.html>


[69] [CITE[HTML5 IRC logs: freenode / #whatwg / 20070731]] ([CODE[2007-08-01 21:48:29 +09:00]] 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20070731#l-32>

[70] [CITE@en[Bidi in HTML]] ([[Jonathan Rosenne]] 著, [CODE[2007-08-04 12:59:05 +09:00]] 版) <https://listserv.heanet.ie/cgi-bin/wa?A2=ind9605&L=html-wg&P=4579>

[71] [CITE[IE-only character entity references]] ([[Philip Taylor <excors+whatwg@...>]] 著, [CODE[2007-07-31 01:52:23 +09:00]] 版) <http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/11549>

[72] [CITE[職人養成スレッド【2代目】]] ([CODE[2003-07-14 22:01:53 +09:00]] 版) <http://jbbs.livedoor.jp/computer/5580/storage/1053610548.html>

[73] [CITE[Character entity reference like strings in 2ch threads]] ([CODE[2007-08-04 14:35:19 +09:00]] 版) <http://suika.suikawiki.org/www/2007/2ch-entities/>

[74] [CITE@en[XML Entity definitions for Characters]] ([CODE[2007-12-14 08:17:22 +09:00]] 版) <http://www.w3.org/TR/2007/WD-xml-entity-names-20071214/>

[76] [CITE[XML Entity Declarations for Characters]] ([CODE[2007-11-28 01:41:16 +09:00]] 版) <http://www.w3.org/2003/entities/>

[77] [CITE[Bug 289938 &#8211; Should use real astral chars (not PUA) for math chars outside the Basic Multilingual Plane]] ([CODE[2008-03-21 21:24:13 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=289938>

[78] [CITE[Bug 7386 &#8211; XML Parse Error on feeds containing external entities]] ([TIME[2008-03-29 13:21:35 +09:00]] 版) <https://www.mozdev.org/bugs/show_bug.cgi?id=7386>

[79] [CITE@en[RSS 0.90 Specification]] ([TIME[2008-11-22 17:16:09 +09:00]] 版) <http://www.rssboard.org/rss-0-9-0#special_characters>
によると、 [[RSS 0.9]] では [[HTML]] と同じ[[文字実体参照]]が使えたようです。
でも [[RSS 0.9]] は [[DTD]] がない [[RDF/XML]] [[文書]]のようですが・・・。
だから[[整形式]]にならないと思うのですが。。。

[39] See [[Cello]]

[40] [CITE@en[mathml-refresh/xml-entities]]
([TIME[2019-06-16 18:45:06 +09:00]])
<https://github.com/mathml-refresh/xml-entities>

[84] 
[CITE[IRC logs: freenode / #whatwg / 20090924]]
([TIME[2009-11-16 22:42:36 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090924#l-536>

[85] [CITE[NLM Journal Archiving and Interchange Tag Suite Version 2.1]]
([TIME[2016-05-09T17:30:16.000Z]], [TIME[2020-10-28T09:24:38.826Z]])
<http://dtd.nlm.nih.gov/2.1/>

