%URI

HTMLにおけるURL

[22] HTML ではいろいろな場所で URL が使われます。

構文

[18] HTML では、 URL に関する次の構文が規定されています。

文脈

[23] HTML における URL

歴史

[21] HTML5URL Standard まで、 HTML における URL の定義は混乱した状況にありました。 (これは HTML 特有の事情ではなく URL というもの自体が混乱していました。)

HTML4

[1] HTML 4 では、URI という語を [URI] で定義されている意味で使います。と IW:HTML4:"types.html#type-uri" に書いてあります。 [URI] は HTML 4.01 では RFC 2396 のことです。

と、これはちょっと困ったことになります。 RFC 2396 では URIURI参照を区別しているのです。 RFC 2396 の4章によれば、 URI 参照から素片識別子を取り除き、 相対URI は解決して得た絶対URI こそが the URI であるというのです。 これじゃあ、 HTML 4 でたとえば href 属性に相対 URI も素片識別子も使えなくなっちゃう。。。

[2] URI の紹介のところ IW:HTML4:"intro/intro.html#h-2.1" では相対 URI も素片識別子も含めて URI と言っています。 これが本来の意図であることは明らかです。 下手に RFC を参照せずにちゃんと説明しておけば良かったものを。。。

[3] まあ、 URI 関係の概念と名前は歴史的に泥々してますからあんまり責めちゃ可愛そうではあります。

ちなみに XHTML 1 はちゃんと URI 参照と書いていたりします。。。

%URI; 型 (HTML 4)

[4] HTML 4 では、 %URI; 型の属性の値は URI (>>1) です。

[5] 仕様書:

HTML 4.01XHTML m12nRFC 2396 を参照しています (>>1) が、 RFC 1738RFC 1808 も参考文献一覧にしぶとく残っています。

[6] URI は一般に大文字・小文字を区別します。 部分部分は区別しないこともありますが、全体としては区別します。

非 ASCII 文字

[7] HTML 4 附属書 B (参考) には、 URI 属性値の非 ASCII 文字の取り扱いについての推奨事項が書かれています。

要点:

  • URI は非 ASCII 文字を含みませんが、著者は %URI 属性値に非 ASCII 文字を含む URI のようなものを指定しちゃいます。
    • 違法な例: <A href="http://foo.example/ハーコン">...</A> HTML 4 B.2.1 改
  • UA は非 ASCII 文字を次の通り変換することを推奨 (recommend) します。
    1. UTF-8 (RFC 2279) で表現する
    2. 問題のバイトを URI符号化する
  • こうすれば、 HTML 文書の文字符号化とは独立な、 構文的に合法の URI (RFC 1738 + RFC 2141) を生成できます。
  • 古い UA は URI を受信した文書符号化で処理します。 古い HTML 文書はこれに依存していて、文書の符号を変換するとおかしくなります。
    • 古い文書も扱いたい UA は、合法でない文字を含む URI を受信したら、最初に UTF-8 にしてみて、 うまくいかなかった時だけ元の符号化を使ってみるべきです。
  • name 属性値にも同じ UTF-8 の符号化を適用するべきです。

[8] 突っ込み:

  • 非 ASCII 文字のみならず、一部の ASCII 文字と ASCII の非印字可能文字も URI 逃避符号化しないと、合法な URI参照にはなりません。
  • なんで RFC 2141 なんて参照しているんだか。 (お前 URN て言いたいだけちゃうんか?) RFC 2396 を参照するべきですが、修正し忘れでしょうか。
  • HTML 4 の当時に URI を UTF-8 + URI 逃避符号化というのは極々稀々であったはずです。 W3C の i18n な人達としては UTF-8 に誘導したいのでしょうが (後の IRI)、 older とかお茶を濁すのではなく、 もうちょっと丁寧に現状を説明するべきだったのではないでしょうか。
  • name 属性云々は意味不明です。素片識別子として使う時は UTF-8 + URI 逃避符号化せよという意味でしょうか。

アンド記号の入った URI

[9] HTML 4 は、次のように述べています。

フォーム提出で構築される URI は、 a href などでも使うことがあります。 運が悪くも & をフォーム欄の分離子に使うと属性値表記の中で逃避して &amp; のように書かなければなりません。

HTTP 鯖実装者と特に CGI 実装者は、 & の代わりに ; を使うのにも対応することを推奨します。

HTML 4 B.2.2 Ampersands in URI attribute values IW:HTML4:"appendix/notes.html#ampersands-in-uris" より要約

[10] この規定に触発されたのかどうかは知りませんが、 最近では CGIスクリプトの実装で &; を等しく query の分離子とみなすのが普通になっているようです。

(HTTP や CGI の鯖がそう実装しているのは見たことがありません。 というか HTTP や CGI の鯖が query を解釈するのは見たことがありません。。。)

ただ、 form 要素の属性か何かで XForms のように application/x-www-form-urlencoded の分離子を指定する方法を用意しておけば、 もっと広がったのではないかと思いますのに残念です。 フォームの提出時とアンカーをたどった時とで URI の形が変わってしまうのは、なんとも美しくありません。

XDM

[12] XSLT 2.0 and XQuery 1.0 Serialization (Second Edition) ( ( 版)) http://www.w3.org/TR/2010/REC-xslt-xquery-serialization-20101214/#uri-attribute-values

[13] XSLT 2.0 and XQuery 1.0 Serialization (Second Edition) ( ( 版)) http://www.w3.org/TR/2010/REC-xslt-xquery-serialization-20101214/#list-of-uri-attributes

[14] XSLT and XQuery Serialization 3.0 ( ( 版)) http://www.w3.org/TR/xslt-xquery-serialization-30/#list-of-uri-attributes

[15] XSLT and XQuery Serialization 3.0 ( ( 版)) http://www.w3.org/TR/xslt-xquery-serialization-30/#uri-attribute-values

[16] XSLT and XQuery Serialization 3.0 ( ( 版)) http://www.w3.org/TR/xslt-xquery-serialization-3/#uri-attribute-values

[17] XSLT and XQuery Serialization 3.0 ( ( 版)) http://www.w3.org/TR/xslt-xquery-serialization-3/#list-of-uri-attributes

XHTML2

[11] XHTML2 の最初の作業原案では XML Schema 第1版勧告anyURI であるとされていました。

HTML5 以後

[19] URL Standard 参照。

[20] XSLT and XQuery Serialization 3.1 () https://www.w3.org/TR/2017/REC-xslt-xquery-serialization-31-20170321/#uri-attribute-values