* data: URI scheme [10] [DFN[[CODE(URI)[data:]]]] は、[[実体]]を直接記述する [[URI scheme]] です。 [11] 仕様書: - [[RFC 2397]] [[#comment]] ** 構文 [12] [CODE(URI)[data:]] URI の構文は次のように簡単に表せます [SRC[RFC 2397 2.]]。 > [CODE(URI)[data:[<[VAR[mediatype]]>][;base64],<[VAR[data]]>]] [13] 正式には次のように定義されます [SRC[RFC 2397 3.]]。 > - dataurl := "data:" [ mediatype ] [ ";base64" ] "," data - mediatype := [ type "/" subtype ] *( ";" parameter ) - data := *urlchar - parameter := attribute "=" value - urlchar ・・・ [[RFC 2396]] 参照 - type, subtype, attribute, value ・・・ [[RFC 2045]] 参照 自明だからどうでも良いと思ったのか、この構文定義自体が何で書かれているのか説明がありません:) [[ABNF]] だろうと思いますが・・・。そして致命的なことに、 RFC 2396 で [Q[urlchar]] なるものは定義されていません。たぶん [CODE(ABNF)[[[uric]]]] のことを言っているつもりなのでしょうが。。。 [14] [CODE(ABNF)[value]] は [[RFC 2045]] で [CODE(ABMF)[[[token]]]] または [CODE(ABNF)[[[quoted-string]]]] と定義されています。しかし、 [CODE(ABNF)[quoted-string]] は URI で直接使えない ([CODE(ABNF)[[[unsafe]]]] な) [CODE(char)["]] や [CODE(char)[\]] を使います。そこで、 RFC 2397 3. は、 [CODE(ABNF)[quoted-string]] ではなく [[URI逃避符号化]]するべきだと述べています。 ここで、 >>13 に示されている構文には不備があることがわかります。 [CODE(ABNF)[token]] で使える文字には [CODE(char)[%]] が含まれますから、 たとえば [Q[100%!]] は妥当な [CODE(ABNF)[token]] です。しかし、 16進数字が2つ続かない [CODE(char)[%]] を URI で使うことはできません。 百分率記号を表したいときは、 [CODE(char)[%25]] と書かなければなりません。 しかし、 [Q[100%25!]] と書いたとしても、構文を素直に解釈して [Q[100%25!]] という値であると理解されてしまうかもしれません。 URI 逃避符号化に関する問題は他にもあります。たとえば [CODE(ABNF)[subtype]] が [SAMP(MIME)[svg+xml]] であったとして、 URI に [SAMP(URI)[svg+xm%6C]] と書くことは、問題ありません。 (あらゆる種類の URI で英数字は逃避符号化であるか否かの区別に意味がないと規定されています。) しかし、 [SAMP(URI)[svg%2Bxml]] が前2例と等価であるのか否かは明らかではありません。 ([CODE(char)[+]] は [CODE(char)[[[reserved]]]] なので。) URI の構文の一部に URI 以外のプロトコル要素の定義を引用することはよくありますが、 このような解釈の問題が起きないように、慎重に設計することをお願いしたいものです。 [15] また、 [CODE(ABNF)[";base64"]] が指定されると、 [CODE(ABNF)[data]] は [[Base64]] と解釈されます。 (この指定で大文字と小文字が区別されるかどうかがよくわからないのも問題です。) ところが、その [Q[Base64]] の定義が何を参照しているのかが全然書かれていません。 他のところで RFC 2045 を参照しているので、そこで定義されているものと解釈するのが一番もっともらしそうですが、 Base64 は色々な変種が知られているので、油断できません。 (その変種のほとんどが、 RFC 2045 の [[MIME]] にべったりな部分に手を加えたものです。) たとえば、改行や空白の問題があります。 RFC 2045 の Base64 では一行の字数制限があるのですが、それが適用されるかどうかわかりません。 4. には次のような例が載っています。 > [PRE(HTML)[ Larry ]PRE] 行頭の[[間隔]]は RFC としての余白です。 それを無視したとしても、行を折り返しているのが RFC としての行字数制約によるだけで本来いれては'''ならない'''ものなのか、 RFC の制限だけど実際にも入れても'''よい''' '''ものなのか、説明が全然ありません。''' (かりに入れてもよいとしても、 URI 逃避符号化しない限り URI 全体の構文に違反しますがね。) ([[名無しさん]]) [16] >>15 のようなことが気になるのは、実際に生の改行入りで [[XLink]] の属性なんかに指定した例が存在するからです。 (XLink の [CODE(XMLa)[[VAR[xlink:]][[href]]]] 属性値は [[URI参照]]そのものではなく、 [Q[URI 逃避符号化すれば URI 参照になるもの]]なので、 XLink 的にも一般の URI 的にもこの指定自体は一応合法。) ([[名無しさん]]) [[#comment]] ** メモ [9] [CITE[The data: URI kitchen]] 任意のデータから [CODE(URI)[data:]] URI をつくってくれます。 [[#comment]] * object 要素 data 属性 (HTML, XHTML 1) [1] [[HTML]] の [CODE(HTMLe)[[[object]]]] 要素の [DFN[[CODE(HTMLa)[data]] 属性]]は、[[物体]]のデータ (例えば、画像を定義する物体の実現値画像データ。 より一般的に言えば、再生かのうな物体の[[直列化]]形) を指定します。 [2] 仕様書: - [[HTML 4]] -- [CITE[13.3 Generic inclusion: the [CODE(HTMLe)[OBJECT]] element]] -- [CODE(HTMLe)[object]] 要素 [CODE(HTMLa)[data]] 属性 -- [CITE[HTML 4 Changes]] [[#comment]] ** 属性値 [3] この属性の値は [CODE(SGML)[%[[URI]]]] です。 [[SGML]] 的には [CODE(SGML)[[[CDATA]]]] です。 指定された [[URI参照]]が[[相対URI参照]]である場合には、 [CODE(HTMLa)[[[codebase]]]] 属性値が (あれば) [[基底URI]] として解決に使われます。 [4] この属性は省略可能です。 [[#comment]] ** 他との関係 [5] [CODE(HTMLa)[[[codebase]]]] 属性が相対 URI 参照の解決に使われます。 [CODE(HTMla)[[[archive]]]] 属性で指定された資源から [CODE(HTMLa)[data]] で指定された資源が得られるかもしれません。 [CODE(HTMLa)[data]] 資源の[[媒体型]]のヒントが [CODE(HTMLa)[[[type]]] 属性から得られます。]] [6] [CODE(HTMLa)[[[classid]]]] (実装) と [CODE(HTMLa)[data]] (データ) は両方指定しても構いませんし、一方だけでも構いません。 しかし、両方指定したときの挙動は未定義です。 可搬性のために、実装が取り寄せる追加のデータは [CODE(HTMLa)[data]] ではなく [CODE(HTMLe)[[[param]]]] で指定するべきです。 [SRC[HTML 4.01 13.3]] [8] >>6 とかいいながら、仕様書には併用した例が随分と沢山出てきます。 [[#comment]] ** 例 [7] データを [CODE(URI)[[[data]]:]] URI で HTML 中に埋込む例 [PRE(HTML)[

A clock. ]PRE] [WEAK[(HTML 4 仕様書より)]] [[#comment]] ** メモ [[#comment]] * フォーム制御子 [CODE(HTMLa)@en[data]] 属性 (HTML) @@ - [[Web Forms 2.0]] -- [CSECTION@en[2.12. The [CODE(HTMLe)@en[[[datalist]]]] element and the [CODE(HTMLa)@en[[[list]]]] attribute]] > The datalist element may be prefilled from an external file with the data attribute. [[#comment]] * メモ