/[pub]/suikawiki/sw4data/ids/2/675.txt
Suika

Contents of /suikawiki/sw4data/ids/2/675.txt

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations) (download)
Tue Dec 1 23:27:14 2009 UTC (15 years ago) by wakaba
Branch: MAIN
Changes since 1.3: +5 -0 lines
File MIME type: text/plain
updated by (anon)

1 wakaba 1.2
2    
3     * data: URI scheme
4    
5     [10] [DFN[[CODE(URI)[data:]]]] は、[[実体]]を直接記述する [[URI scheme]] です。
6    
7     [11] 仕様書:
8     - [[RFC 2397]] <urn:ietf:rfc:2397>
9    
10     [[#comment]]
11    
12    
13     ** 構文
14    
15     [22] (他の [[URI scheme]] 同様) [CODE(URI)@en[[[data]]:]] [[URI scheme]]
16     の仕様は非常に曖昧です。古い時代の仕様書なので仕方がありませんが、
17     どこまでが[[規定]]でどこからが[[参考]]なのかも明確ではありません。
18    
19     [12] '''構文の概要''':
20     [[RFC 2397]] の2章によると、 [CODE(URI)@en[[[data]]:]] URI
21     の構文を簡単にあらわすと
22    
23     > [CODE(URI)[data:[<[VAR[mediatype]]>][;base64],<[VAR[data]]>]]
24    
25     となります。
26    
27     [13] '''構文の定義''':
28     [[RFC 2397]] の3章は更に詳しく
29    
30     >
31     - dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
32     - mediatype := [ type "/" subtype ] *( ";" parameter )
33     - data := *urlchar
34     - parameter := attribute "=" value
35    
36     ;; - [CODE(ABNF)@en[[[urlchar]]]]: [[RFC 2396]] の定義を参照
37     - [CODE(ABNF)@en[[[type]]]], [CODE(ABNF)@en[[[subtype]]]],
38     [CODE(ABNF)@en[[[attribute]]]], [CODE(ABNF)@en[[[value]]]]: [[RFC 2045]]
39     の定義を参照
40    
41     と定義しています。
42    
43     [23] '''構文の定義自体の問題''':
44     自明だからどうでも良いと思ったのか、
45     この構文定義自体が何で書かれているのか説明がありません[AA[wwwww]]
46     [[ABNF]] の一種だろうと思いますが・・・。
47    
48     [24] '''[CODE(ABNF)@en[[[urlc]]]]''':
49     [CODE(ABNF)@en[[[urlc]]]] は [[RFC 2396]] の定義を参照していることになっていますが、
50     実のところ [[RFC 2396]] で [CODE(ABNF)@en[[[urlc]]]] は定義されていません。
51     おそらく [CODE(ABNF)@en[[[uric]]]] の誤りなのでしょうが、これは致命的です。
52    
53     ;; そもそも、 [[RFC 2396]] を参照しておきながらなぜ [Q@en[[[UR''L'' scheme]]]]
54     なのかが謎です。
55    
56     [14] '''[CODE(ABNF)@en[[[value]]]]''':
57     [CODE(ABNF)[[[value]]]] は [[RFC 2045]] で [CODE(ABMF)@en[[[token]]]] または
58     [CODE(ABNF)@en[[[quoted-string]]]] と定義されています。しかし、
59     [CODE(ABNF)@en[[[quoted-string]]]]
60     は URI で直接使えない ([CODE(ABNF)@en[[[unsafe]]]] な) [CODE(char)[[["]]]] や
61     [CODE(char)[[[\]]]] を使います。
62     つまり、構文通り解釈すると使えるはずのものが [[URI]]
63     仕様との整合性を考慮すると使えないのです。
64    
65     実は使えないのはこの2文字だけではなく、[[改行]]を含む[[C0制御文字]]や[[空白]]なども
66     [[URI]] ではそのまま使えません。更に、この [CODE(ABNF)@en[[[value]]]] や、
67     [CODE(ABNF)@en[[[token]]]] として定義されている [CODE(ABNF)@en[[[attribute]]]]
68     には [CODE(char)@en[[[%]]]] を含めることができますが、 [[URI]]
69     では [CODE(char)@en[[[%]]]] は[[百分率符号化]]のための特別な文字として使われます。
70    
71     [25] '''百分率符号化''':
72     [[RFC 2397]] の[[著者]]も馬鹿ではありませんから、[[百分率符号化]]
73     (当時の名称は [[URI逃避符号化]]、[[RFC 2396]] における呼称は
74     [[URL逃避符号化]]) との関係に言及しています。
75    
76     [26]
77     まず一点目に、[Q[必要に応じて[[百分率符号化]]を用いて表現する]]との旨が規定されています
78     [SRC@en[[[RFC 2397]] 3.]]:
79    
80     >
81     [PRE[
82     [INS[(ABNF 構文定義)]]
83     where "urlchar" is imported from [RFC2396], and "type", "subtype",
84     "attribute" and "value" are the corresponding tokens from [RFC2045],
85     represented using URL escaped encoding of [RFC2396] as necessary.
86     ]PRE]
87    
88     この最後の部分がどこに係っているのかが曖昧なので、3通りの解釈が可能です:
89     - [[百分率符号化]]は [CODE(ABNF)@en[[[type]]]], [CODE(ABNF)@en[[[subtype]]]],
90     [CODE(ABNF)@en[[[attribute]]]], [CODE(ABNF)@en[[[value]]]] で使用可能
91     - [[百分率符号化]]は [CODE(ABNF)@en[[[urlc]]]],
92     [CODE(ABNF)@en[[[type]]]], [CODE(ABNF)@en[[[subtype]]]],
93     [CODE(ABNF)@en[[[attribute]]]], [CODE(ABNF)@en[[[value]]]] で使用可能
94     - [[百分率符号化]]は [CODE(URI)@en[[[data]]:]] URI 全体で使用可能
95    
96     普通修飾するのは直前のものでしょうから、3つ目の解釈は少々無理があるかもしれませんが、
97     あり得ないとまではいえません。ちなみに3つ目の解釈に従うなら
98     [CODE(URI)@en[[[base64]]]] の部分に[[百分率符号化]]が使えます。
99     1つ目と2つ目の解釈の違いは [CODE(ABNF)@en[[[urlc]]]] で[[百分率符号化]]が使えるか否かですが、
100     そもそも [CODE(ABNF)@en[[[ur''i''c]]]] には [CODE(ABNF)@en[[[escaped]]]]
101     ([[百分率符号化]]) が含まれているので、どちらでも同じことになります。
102    
103     [Q@en[as necessary]] というのも曲者で、穿った読み方をすれば、
104     必要でない場合には使ってもよいとされていないとも解釈し得ます。
105     (流石にこれは深読みしすぎでしょうが。)
106    
107     [27] 2点目に、[CODE(ABNF)@en[[[value]]]] での[[百分率符号化]]について、
108    
109     >
110     [PRE[
111     However, within a "data" URL, the
112     "quoted-string" representation would be awkward, since the quote mark
113     is itself not a valid urlchar. For this reason, parameter values
114     should use the URL Escaped encoding instead of quoted string if the
115     parameter values contain any "tspecial".
116     ]PRE]
117    
118     と言及しています [SRC@en[[[RFC 2397]] 3.]]。ここで、
119     前述の構文が[[百分率符号化]]込みのものと理解するべきかという問題が発生します。
120     この引用部をそのまま解釈すると、 [CODE(ABNF)@en[[[token]]]] の部分に[[百分率符号化]]が使えることになります。
121    
122     [CODE(ABNF)@en[[[token]]]] を定義している [[RFC 2045]] は [[URI]]
123     のことなど気にしていないので、当然[[百分率符号化]]が使えるかどうか、
124     その使い方には言及していません。ただし、[CODE(ABNF)@en[[[token]]]]
125     で使える[[文字]]には [CODE(char)[[[%]]]] が含まれています
126     (この辺の事情は引用部の [Q@en[should not]] を無視して
127     [CODE(ABNF)@en[[[quoted-string]]]] を使う場合にも該当します)。
128     たとえば [CODE(example)@en[100%!]] は[[妥当]]な [CODE(ABNF)@en[[[token]]]] です。しかし、
129     [[16進数字]]が2つ続かない [CODE(char)[[[%]]]] を [[URI]] で使うことはできません。
130     [[URI]] の仕様に従うなら、
131     [[百分率記号]]を表したいときは [CODE(URI)[[[%]]25]] と書かなければなりません。
132    
133     [28]
134     また、[[百分率符号化]]を前述の部分のどんな[[文字]]にも使ってよいのかも明確ではありません。
135     たとえば [CODE(ABNF)@en[[[subtype]]]]
136     が [SAMP(MIME example)@en[svg+xml]] であったとして、 [[URI]] に
137     [CODE(example URI)[svg+xm%6C]] と書いても、 (どんな [[URI scheme]]
138     でも[[非予約]]な[[文字]]は[[百分率符号化]]してもしなくても[[等価]]なので)
139     問題ありません。
140     しかし、 [CODE(URI example)[svg%2Bxml]]
141     が前2例と[[等価]]であるのか否かは明らかではありません。
142     ([CODE(char)[+]] は [CODE(char)[[[reserved]]]] なので。)
143     意図としては[[百分率符号化]]を使っても構わないのでしょうが。。。
144    
145     ;;
146     URI の構文の一部に URI 以外のプロトコル要素の定義を引用することはよくありますが、
147     このような解釈の問題が起きないように、慎重に設計することをお願いしたいものです。
148    
149     [15] '''Base64''':
150     また、 [CODE(ABNF)[";base64"]] が指定されると、 [CODE(ABNF)[data]] は [[Base64]] と解釈されます。
151     (この指定で大文字と小文字が区別されるかどうかがよくわからないのも問題です。)
152    
153     ところが、その [Q[Base64]] の定義が何を参照しているのかが全然書かれていません。
154     他のところで RFC 2045 を参照しているので、そこで定義されているものと解釈するのが一番もっともらしそうですが、
155     Base64 は色々な変種が知られているので、油断できません。 (その変種のほとんどが、 RFC 2045 の [[MIME]] にべったりな部分に手を加えたものです。)
156    
157     たとえば、改行や空白の問題があります。
158     RFC 2045 の Base64 では一行の字数制限があるのですが、それが適用されるかどうかわかりません。
159    
160     4. には次のような例が載っています。
161    
162     >
163     [PRE(HTML)[
164     <IMG
165     SRC="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw
166     AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz
167     ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp
168     a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl
169     ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis
170     F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH
171     hhx4dbgYKAAA7"
172     ALT="Larry">
173     ]PRE]
174    
175     行頭の[[間隔]]は RFC としての余白です。
176     それを無視したとしても、行を折り返しているのが
177     RFC としての行字数制約によるだけで本来いれては'''ならない'''ものなのか、
178     RFC の制限だけど実際にも入れても'''よい'''
179     '''ものなのか、説明が全然ありません。'''
180     (かりに入れてもよいとしても、 URI 逃避符号化しない限り URI 全体の構文に違反しますがね。)
181    
182     [16]
183     >>15 のようなことが気になるのは、実際に生の改行入りで [[XLink]] の属性なんかに指定した例が存在するからです。
184     (XLink の [CODE(XMLa)[[VAR[xlink:]][[href]]]] 属性値は [[URI参照]]そのものではなく、
185     [Q[URI 逃避符号化すれば URI 参照になるもの]]なので、 XLink 的にも一般の URI 的にもこの指定自体は一応合法。)
186    
187     [29] '''空白''':
188     [[RFC 2045]] [[MIME]] を [[RFC 822]] [[電子メイル]]の文脈で使う場合、
189     [[構文]]定義上は明記されていませんが、[[字句]]間に[[空白]]
190     ([[RFC 822]] では [CODE(ABNF)@en[[[LWS]]]] や [CODE(ABNF)@en[[[comment]]]]、後の
191     [[RFC 2822]] では [CODE(ABNF)@en[[[CFWS]]]]) を挿入してもよいことになっています。
192     それに従えば [CODE(ABNF)@en[[[type]]]], [CODE(ABNF)@en[[[subtype]]]],
193     [CODE(ABNF)@en[[[attribute]]]], [CODE(ABNF)@en[[[value]]]] の前後に[[空白]]を挿入できることになりますが、
194     [[RFC 2397]] ではそのことにまったく言及していません (>>23
195     で指摘したように、そもそも構文定義自体の記述方法の説明がありません)。
196    
197     [30] '''[[RFC 2231]] [[引数値]]拡張''':
198     [[RFC 2231]] は [[RFC 2045]] の [CODE(MIME)@en[[[Content-Type]]:]] [[頭欄]]で用いられるような[[引数値]]の構文の拡張を定義しています。
199     [CODE(URI)@en[[[data]]:]] [[URI scheme]] でこの拡張を使うことができるのかは不明です。
200    
201     [31] '''素片識別子''':
202     [[RFC 2397]] は[[素片識別子]]にまったく言及していません。
203     [[RFC 2396]] は[[素片識別子]]は [[URI]] の一部ではなく、
204     [[URI参照]]の一部であるという立場をとっていたので
205     (後の [[RFC 3986]] では[[素片識別子]]も [[URI]]
206     の一部)、その考えに従っているのかもしれません。
207    
208     [[Ian Hickson]] はかつて、 [CODE(URI)@en[[[data]]:]] [[URI]]
209     では[[素片識別子]]が使えないと主張していたように見えますが
210     (>>21 にあるテストのソースを参照)、この事実以外に何か根拠があるのかは不明ですし、
211     現在もそのように主張しているのかは不明です。
212    
213     [34]
214     >>27 の引用部の本来の意図はどう読んでも [Q[[CODE(ABNF)@en[[[quoted-string]]]] の代わりに [CODE(ABNF)@en[[[token]]]] + [[百分率符号化]]を使うのがよい]]なのですが、
215     >>27 のように解釈しても問題がありますし、[CODE(ABNF)@en[[[value]]]] は
216     [WEAK[([[百分率符号化]]を前提としていない [[RFC 2045]] の構文規則なので)]]
217     [[百分率符号化]]を解いた後の[[文字列]]に対する構文規則である、と解釈しても問題があります。
218     [CODE(ABNF)@en[[[tspecials]]]] を含むような[[文字列]]は[[妥当]]な
219     [CODE(ABNF)@en[[[token]]]] ではありませんから、
220     [CODE(example URI)@en[a%40b]] を元に戻した [CODE(example MIME)@en[a@b]]
221     は [CODE(ABNF)@en[[[token]]]] 足りえません
222     [WEAK[(元の意図は、 [CODE(example MIME)@en[a@b]] を [CODE(example URI)@en["a@b"]] としなくてもよいとするもののはずです)]]。
223    
224     ([[名無しさん]])
225    
226     [[#comment]]
227    
228    
229     ** 処理モデル
230    
231     [32]
232     他の [[URI scheme]] の仕様書と同様、 [[RFC 2397]] は
233     [CODE(URI)@en[[[data]]:]] [[URI scheme]] の構文を定義するだけで
234     [WEAK[(それすらも前述のように満足にできていないわけですが)]]、
235     どのように処理するべきか、構文的に誤った [CODE(URI)@en[[[data]]:]]
236     [[URI]] をどう扱うべきかに一切言及していません。
237    
238     [33]
239     '''百分率符号化された8ビット部''':
240     [[百分率符号化]]された[[オクテット]]があった場合、
241     [CODE(ABNF)@en[[[data]]]] 部なら指定された[[媒体型]]に従って解釈するのでいいのでしょうが、
242     それ以外の部分ならどう解釈するべきなのかが問題になり得ます。
243     [CODE(ABNF)@en[[[type]]]] や [CODE(ABNF)@en[[[subtype]]]] や
244     [CODE(ABNF)@en[[[attribute]]]] の部分はそもそも [[ASCII]] [[文字]]だけで定義されているので、
245     8ビット部が [[ASCII]] に写像されない限りどう解釈しようが問題にはなりません。
246    
247     ;; たとえば8ビット目を落とすとか、[[UTF-8]] で [[Unicode case-insensitive]]
248     に処理したりすると問題になりますが。
249    
250     [CODE(ABNF)@en[[[value]]]] の部分は任意の文字列を指定し得るので、
251     [[文字コード]]が問題となります。[[MIME]] 的に正しいのはそれでもやはり
252     [[ASCII]] [[文字]]だけですが。。。
253    
254 wakaba 1.3 * フォーム提出
255 wakaba 1.2
256 wakaba 1.3 [38] [CITE@en-GB-x-Hixie[Web Forms 2.0]] ([TIME[2009-01-05 20:07:15 +09:00]] 版) <http://www.whatwg.org/specs/web-forms/current-work/#for-data>
257 wakaba 1.2
258 wakaba 1.3 * テスト
259 wakaba 1.2
260     [19]
261     [CITE[data: URL tests]] ([CODE[2008-05-15 05:24:13 +09:00]] 版) <http://www.mozilla.org/quality/networking/testing/datatests.html>
262    
263     [20]
264     [CITE[Opera Browser Wiki :: Data: URI Test Page]] ([CODE[2008-05-18 19:13:55 +09:00]] 版) <http://operawiki.info/DataURIs>
265    
266     [21]
267     [CITE[Index of /tests/adhoc/data]] ([CODE[2008-05-18 19:24:49 +09:00]] 版) <http://www.hixie.ch/tests/adhoc/data/>
268    
269     [35]
270     [CITE@en[data: URIs]] ([CODE[2008-06-01 20:50:55 +09:00]] 版) <http://suika.fam.cx/~wakaba/-temp/test/uri/data/test.cgi#>
271     ([[名無しさん]])
272    
273     [[#comment]]
274    
275    
276     ** メモ
277    
278     [9]
279     [CITE[The data: URI kitchen]] <http://software.hixie.ch/utilities/cgi/data/data>
280     任意のデータから [CODE(URI)[data:]] URI をつくってくれます。
281    
282     [18]
283     [CITE[Bug 16968 - Security violations in Acid3 test]] ([CODE[2008-01-22 20:19:03 +09:00]] 版) <http://bugs.webkit.org/show_bug.cgi?id=16968>
284    
285    
286     [36]
287 wakaba 1.1 3ブラウザとも、 [CODE(MIME)@en[[[name]]]] [[引数]]を[[ファイル名]]に使うことはないようです。
288    
289     ;; [CITE@en[data: URIs]] ([TIME[2008-06-01 21:08:32 +09:00]] 版) <http://suika.fam.cx/~wakaba/-temp/test/uri/data/test.cgi#tag=name%20parameter>
290    
291 wakaba 1.2
292     ([[名無しさん]])
293    
294    
295     [[#comment]]
296    
297    
298     * object 要素 data 属性 (HTML, XHTML 1)
299    
300     [1] [[HTML]] の [CODE(HTMLe)[[[object]]]] 要素の
301     [DFN[[CODE(HTMLa)[data]] 属性]]は、[[物体]]のデータ
302     (例えば、画像を定義する物体の実現値画像データ。
303     より一般的に言えば、再生かのうな物体の[[直列化]]形) を指定します。
304    
305     [2] 仕様書:
306     - [[HTML 4]]
307     -- [CITE[13.3 Generic inclusion: the [CODE(HTMLe)[OBJECT]] element]]
308     <IW:HTML4:"struct/objects.html#include-objects">
309     -- [CODE(HTMLe)[object]] 要素 [CODE(HTMLa)[data]] 属性
310     <IW:HTML4:"struct/objects.html#adef-data">
311     -- [CITE[HTML 4 Changes]]
312     <IW:HTML4:"appendix/changes.html#h-A.1.1.9">
313    
314     [[#comment]]
315    
316    
317     ** 属性値
318    
319     [3] この属性の値は [CODE(SGML)[%[[URI]]]] です。
320     [[SGML]] 的には [CODE(SGML)[[[CDATA]]]] です。
321    
322     指定された [[URI参照]]が[[相対URI参照]]である場合には、 [CODE(HTMLa)[[[codebase]]]]
323     属性値が (あれば) [[基底URI]] として解決に使われます。
324    
325     [4] この属性は省略可能です。
326    
327     [[#comment]]
328    
329    
330     ** 他との関係
331    
332     [5] [CODE(HTMLa)[[[codebase]]]] 属性が相対 URI 参照の解決に使われます。
333     [CODE(HTMla)[[[archive]]]] 属性で指定された資源から
334     [CODE(HTMLa)[data]] で指定された資源が得られるかもしれません。
335     [CODE(HTMLa)[data]] 資源の[[媒体型]]のヒントが
336     [CODE(HTMLa)[[[type]]] 属性から得られます。]]
337    
338     [6] [CODE(HTMLa)[[[classid]]]] (実装) と [CODE(HTMLa)[data]] (データ)
339     は両方指定しても構いませんし、一方だけでも構いません。
340     しかし、両方指定したときの挙動は未定義です。
341     可搬性のために、実装が取り寄せる追加のデータは [CODE(HTMLa)[data]]
342     ではなく [CODE(HTMLe)[[[param]]]] で指定するべきです。 [SRC[HTML 4.01 13.3]]
343    
344     [8]
345     >>6 とかいいながら、仕様書には併用した例が随分と沢山出てきます。
346    
347     [[#comment]]
348    
349    
350     ** 例
351    
352     [7] データを [CODE(URI)[[[data]]:]] URI で HTML
353     中に埋込む例
354     [PRE(HTML)[
355     <P>
356     <OBJECT id="clock1"
357     classid="clsid:663C8FEF-1EF9-11CF-A3DB-080036F12502"
358     data="data:application/x-oleobject;base64,[VAR[...base64 data...]]">
359     A clock.
360     </OBJECT>
361     ]PRE]
362    
363     [WEAK[(HTML 4 仕様書より)]]
364    
365     [17]
366     [CITE@ja[★お友達のお店★|♪Naoの神コレブログ♪]] ([CODE[2007-10-21 20:34:09 +09:00]] 版) <http://ameblo.jp/kobe-naoko/entry-10047146028.html>
367    
368     >
369     [PRE(HTML example code)[
370     <li>
371     <object data="http://stat.ameba.jp/blog/genre/girlsblog/checker/kobe-collection/bloglist.swf" type="application/x-shockwave-flash" width="170" height="620">
372     <param name="movie" value="http://stat.ameba.jp/blog/genre/girlsblog/checker/kobe-collection/bloglist.swf" />
373     Flashプラグインの使用について。
374     GiRLS GATEでは、コンテンツの一部にFlashを使用しております。Flashが表示されない方は、Flash Playerをインストールしてからご覧下さい。<a href="www.adobe.com/go/getflashplayer_jp">Flash Playerダウンロードページへ。</a>
375     </object></li>
376     ]PRE]
377    
378     [[Flash]] を [CODE(HTMLa)@en[[[data]]]] で埋め込んでいる珍しい例。
379    
380 wakaba 1.3 * メモ
381 wakaba 1.2
382     [37]
383     [CITE@ja[Protocol Handlers for Microsoft Internet Explorer - misuzilla.org]] ([[Mayuki Sawatari]] 著, [TIME[2007-04-28 12:45:30 +09:00]] 版) <http://www.misuzilla.org/dist/net/mphandler/>
384 wakaba 1.4
385    
386     [39] [CITE[IRC logs: freenode / #whatwg / 20090928]]
387     ([TIME[2009-12-02 08:12:56 +09:00]] 版)
388     <http://krijnhoetmer.nl/irc-logs/whatwg/20090928#l-763>

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24