[36] [DFN[噂の ID 問題]]とは、2001年頃~2004年頃に話題になった、 [[HTML]] の [CODE(HTMLa)@en[[[id]]]] [[属性値]]の[[大文字]]・[[小文字]]の扱いに関する問題です。 当時 [[HTML]] の規範とされていた [[HTML4]] 仕様は、 [[HTML]] が [[SGML応用]]であるとの空想 (あるいは願望) の上に構築されていました。 [[HTML4]] の [CODE(HTMLa)@en[[[id]]]] [[属性]]は [[SGML]] の [CODE(SGML)@en[[[ID]]]] [[属性型]]として定義されていましたが、 [[HTML4]] の [[SGML宣言]]により、 [CODE(HTMLa)@en[[[id]]]] [[属性値]]は [[SGML構文解析器]]によって[[大文字]]に[[正規化]]されると記述されていました。 しかし、実は [[HTML4]] の中の人の意図も、現実の [[Webブラウザ]]の実装 (一部を除く。) も、 [CODE(HTMLa)@en[[[id]]]] [[属性]]の[[大文字]]と[[小文字]]は区別されるというものでした。 [[HTML4]] 仕様書中には [CODE(HTMLa)@en[[[id]]]] [[属性]]は[[大文字]]・[[小文字]]を区別すると書かれていましたし、 [[SGML構文解析器]]による[[大文字]]化が行われないとしないと理解できない例が挙げられていました。 つまり、 [[HTML4]] の中の人は [[SGML]] を使っていなかったのでその規定を知らなかったかうっかり忘れており、 仕様書中に示した [[HTML]] [[文書]]の例を実際に [[SGML構文解析器]]を使った [[Webブラウザ]]で確認することもせず (だってそんなもの存在していない!)、 [[Webブラウザ]]を作っている人達も一々 [[Web]] で現実に使われていない [[SGML]] の仕様など確認せず、最初の [[W3C]] [[勧告]]から4年くらい経つまで誰も間違いに気付かなかったというわけです。 それでもまだ人々は [[HTML]] が [[SGML応用]]であるとの夢から醒めていませんでしたから、 一部の人達は仕様上も実装上も問題にならないよう[[大文字]]だけを [CODE(HTMLa)@en[[[id]]]] [[属性値]]として使うべきだと主張しましたし ([[ISO-HTML]] 関係者など)、 仕様の解釈を無理にでもこじつけて当時の現状を正当化しようとした人もいました (当時の [[HTML WG]] など)。 結局仕様と実情が一致するのは [[SGML]] の夢から醒めた [[HTML5]] を待つことになります。 [DEL[ [2] 要約: [[HTML 4]] 以前の ([[XHTML]] になるより前の) HTML の[[終点アンカー]] ([CODE(HTMLa)[[[id]]]] 属性や [CODE(HTMLa)[[[name]]]] 属性の値) に小文字の[[ラテン文字]]を使うことは可能で、 実際によく使われてきましたが、実は規格上問題がありますから、 使わないほうが幸せになります。この問題は [[XHTML]] にはありませんが、[WEAK[XHTML に限らず]] HTML 4 以前の HTML で書かれた文書の[[素片識別子]] ([SAMP(URI)[#[VAR[〜]]]]) を含む [[URI参照]]を使うときにこの問題に巻き込まれる虞がありますから、油断はできません。 ]DEL] 詳しくは次の文献等をどうぞ。 [1] ''釣瓶雜記(2003年11月〜12月)'' 『[[ISO‐HTML利用者の手引き]]』 を引用して詳しく考察しています。 [8] ''User's Guide to ISO/IEC 15445:2000(E) ISO-HTML'' [9] ''2003年11月 - マーク付けノート'' [10] : この問題を日本語圏に知らしめるきっかけとなったメイル。 - [11] ''www-html@w3.org from January 2002: Re: id attribute in HTML 4.01'' : HTML 4 の規定は知っててあーしたということ? - [12] ''Re: HTML ID case question from Steven Pemberton on 2001-07-11 (www-validator@w3.org from July 2001)'' : >>11 以前に HTML WG で出た結論がこれだと。 - [13] 結局 >>11-12 では実装互換性は考慮されてるけど SGML 互換性は全然問題になってない。 HTML にそれを求めるのは酷なことなのでしょうか? - [14] >>13 と思ったけど、実は SGML 的な特性として大文字化前の属性値が保存される、とかいう規定が発見されれば問題はないのかも。素の SGML にはなさげだけど、 [[HyTime]] 辺りにちょこっと書いてあったりしないかなあ? - [15] この問題を知って [[SGML]] の規格を読んでみたくなった方。 [[JISC]] のウェブ・サイト から [[PDF]] で仕様書が入手できます。「JIS 検索」を選んで、「X4151」を探してみてください。無料ですが、規格票を scan した画像を PDF 化したもので素人にはお勧めできない。嫌なら [[JSA]] に紙の規格票でも注文 (有料) しろってこった。 - [16] ''Strict-HTML スレッド17'' : 100番くらい〜でこの話題。 [17] [[CSS]] へのこの問題の影響は? 5.9 ID selectors にはそもそも大文字・小文字の区別に言及がないような。 も同じ。 5.1 Pattern matching には要素型名が HTML では区別されない旨、 5.8.1 Matching attributes and attribute values には属性名・属性値が文書言語によっては区別されない旨が書かれてはいるけど。 他のところの記述を見落としているのでなければ、 そもそも CSS では [SAMP(CSS)[#ID]] は大文字で書かないといけなかったことになる。 [18] 関係ないけど気になったのは、 属性値の区別が文書言語に依存すること。 [DFN[[[文書言語]]]]とは [Q[The encoding language of the source document (e.g., HTML or an XML application).]]だから、 [[XHTML1.0]] で [SAMP(HTML)[

]] と書いてもちゃんと [SAMP(CSS)[p[lang|="ja"] ]] と一致するようになっているわけだ。 でも XHTML じゃなくて何か UA が知らないマーク付け言語だとこうはならない。 [WEAK[悲劇的ですらある CSS の非互換問題の中ではこんなのどうでもいいことかもだけど。]] [19] [[Namazu]] は素片識別子になる [CODE(HTMLa)[[[name]]]] 属性を勝手に小文字にしちゃうようだ ([CODE(HTMLa)[id]] にはそもそも未対応)。 おかげで対策した文書の検索結果の素片識別子が役に立たない。 [[#comment]] * アンカー名の構文 [20] アンカー名 ([CODE(HTMLa)[name]] または [CODE(HTMLa)[id]]) は、文書内で固有でなければなりません。すなわち、 文書内の他の [CODE(HTMLa)[name]] や [CODE(HTMLa)[id]] と同じ名前ではいけません。 しかも、大文字・小文字の違いだけの別の名前を使うこともできません。 仕様書: [[HTML 4]] 12.2.1 Syntax of anchor names [21] 例えば、 [PRE(HTML)[

...

... ]PRE] [WEAK[(HTML 4 仕様書より)]] は違法です。 [25] HTML 4 仕様書によれば、アンカー名は [[ASCII]] 文字に制限するべきです。 [[#comment]] * アンカー名の一致 [22] アンカー名と[[素片識別子]]の一致の検査は、 大文字・小文字を'''区別して'''行わなければなりません。 仕様書: - [[HTML 4]] -- [CITE[12.2.1 Syntax of anchor names]] -- [CITE[12.2.3 Anchors with the id attribute]] -- [CITE[HTML 4 Changes]] [23] 次の例は、合法ですが、 UA の挙動は未定義です (小文字のアンカー名が他で定義されていないとして)。 [PRE(HTML)[

... ...more document...

... ]PRE] [SRC[HTML 4 仕様書]] 一部の UA は (不正に) 一致するものとみなしてしまいますが、 そうでない UA もあります。 [24] >>23 [Q[不正に]]って注記が入っているあたり、 [Q[未定義]]とはいえないような... どうよ? > HTML 4 の中の人 [26] [CODE(HTMLe)[[[a]]]], [CODE(HTMLe)[[[form]]]], [CODE(HTMLe)[[[img]]]], [CODE(HTMLe)[[[map]]]], [CODE(HTMLe)[[[applet]]]], [CODE(HTMLe)[[[frame]]]], [CODE(HTMLe)[[[iframe]]]] では、固有識別子を指定するために [CODE(HTMLa)[[[name]]]] と [CODE(HTMLa)[id]] の両方を指定することが認められます。 ただし、同じ要素の2つの属性の値は同じでなければなりません。 [SRC[HTML 4.01 12.2.3, A.1.1.8]] [28] 合法な例: [PRE(HTML)[

... ]PRE] [WEAK[(HTML 4 仕様書より、改)]] [27] '''違法'''な例: [PRE(HTML)[ ... ...

...pages and pages... ]PRE] [WEAK[(HTML 4 仕様書より、改)]] [[#comment]] * 大文字と小文字の区別のまとめ [31] ,規格 ,識別子 ,区別 ,素片識別子として使用 ,メモ ,SGML {[CODE(SGML)[NAMECASE GENERAL YES]]} ,[CODE(SGML)[ID]] ,なし (大文字化) , , ,SGML {[CODE(SGML)[NAMECASE GENERAL NO]]} ,[CODE(SGML)[ID]] ,あり , , ,XML ,[CODE(XML)[ID]] ,あり ,する , ,HTML 4 ,[CODE(HTMLe)[a]] [CODE(HTMLa)[name]] ,あり ,する ,区別をなくすと区別できない名前は使用禁止 ,HTML 4 ,[CODE(HTMLa)[id]] ,"DTD: なし (大文字化), 本文: あり" ,する ,[CODE(HTMLe)[a]] [CODE(HTMLa)[name]] と同じ名前空間 ,HTML 4 ,[CODE(HTMLe)[img]] [CODE(HTMLa)[name]] ,あり , , ,HTML 4 ,[CODE(HTMLe)[applet]] [CODE(HTMLa)[name]] ,あり , , ,HTML 4 ,[CODE(HTMLe)[map]] [CODE(HTMLa)[name]] ,なし ,する ,HTML 4 ,[CODE(HTMLe)[frame]] [CODE(HTMLa)[name]] ,なし ,HTML 4 ,[CODE(HTMLe)[iframe]] [CODE(HTMLa)[name]] ,なし ,HTML 4 ,[CODE(HTMLe)[form]] [CODE(HTMLa)[name]] ,なし , ,SGML {[CODE(SGML)[NAMECASE GENERAL YES]]} ,[CODE(SGML)[IDREF]] ,なし (大文字化) ,− ,SGML {[CODE(SGML)[NAMECASE GENERAL NO]]} ,[CODE(SGML)[IDREF]] ,あり ,− ,XML ,[CODE(XML)[IDREF]] ,あり ,− ,URI 参照 ,素片識別子 ,あり ,− ,HTML 4 ,素片識別子 ,あり ,− ,HTML 4 ,[CODE(HTMLe)[label]] [CODE(HTMLa)[for]] ,"DTD: なし (大文字化), 本文: あり" ,− , ,HTML 4 ,[CODE(HTMLe)[param]] [CODE(HTMLa)[value]] ([CODE(HTMLa)[datatype]] が [CODE(HTML)[object]]) ,不明 ,− , ,HTML 4 ,[CODE(HTMLe)[meta]] [CODE(HTMLa)[name]] ,あり ,しない ,複数要素で同名可 ,HTML 4 ,[CODE(HTMLe)[param]] [CODE(HTMLa)[name]] ,物体依存 ,しない ,複数要素で同名可 ,HTML 4 ,フォーム制御子 [CODE(HTMLa)[name]] ,あり ,しない ,複数要素で同名可なことも [[#comment]] * id vs name [29] [CODE(HTMLa)[id]] と [CODE(HTMLa)[name]]、 どちらを使うべきかについて、 HTML 4 仕様書 (12.2.3 Anchors with the id attribute ) は次のように説明しています。 - [CODE(HTMLa)[id]] は、アンカー名以外、例えば[[スタイル・シート]]でも利用できる - 古い UA には [CODE(HTMLa)[id]] に対応していないものもある - [CODE(HTMLa)[name]] の方が色々な文字を使える (実体参照も) ただし、 HTML 4 仕様書が [CODE(HTMLa)[id]] では[[文字参照]]や[[実体参照]]を使えないと言っているのは'''間違い'''です。 どちらの属性でも、[[属性値表記]]を使えば参照で書けます。 [30] このうち、古い UA は [CODE(HTMLa)[id]] に対応していないという点は、 HTML 4 が勧告された1990年代後半にはまだ比較的大きな問題でしたが、 今となってはそのような UA はほとんど使われていませんし、 使っていたとしても利用者は既にかなり不利益を被っているはずですから、 もはや気にする必要はまったくないでしょう。 [[#comment]] * メモ [32] [CITE@ja[XHTMLでは大文字のid属性でも大丈夫 - 徒書]] ([[北村曉]] 著, [CODE[2007-01-30 16:04:46 +09:00]] 版) ([[名無しさん]] [WEAK[2007-01-31 21:50:12 +00:00]]) [33] [CITE@ja[余白雑記 > January 2007 - よはくのところ。]] ([[香川さやか]] 著, [CODE[2007-01-30 00:14:33 +09:00]] 版) ([[名無しさん]]) [34] [CITE@ja[id属性値が小文字のHTML4をXHTMLへ移行する場合 - 徒書]] ([[北村曉]] 著, [CODE[2007-01-30 15:59:59 +09:00]] 版) ([[名無しさん]]) [35] [CITE[まじかんと雑記: HTML の id の大文字・小文字の問題]] ([TIME[2008-10-31 23:06:53 +09:00]] 版) ([[名無しさん]])