[22] [[HTML]] ではいろいろな場所で [[URL]] が使われます。

* 構文

[18] [[HTML]] では、 [[URL]] に関する次の構文が規定されています。

[FIG(list)[
- [[妥当なURL]]
- [[妥当な非空URL]]
- [[妥当な間隔に囲まれているかもしれないURL]]
- [[妥当な間隔に囲まれているかもしれない非空URL]]
]FIG]

* 文脈

[FIG(short list)[ [23] [[HTML]] における  [[URL]]
- [CODE[href]]
- [CODE[src]]
- [CODE[action][action=""]]
- [CODE[formaction]]
- [CODE[ping][ping=""]]
- [CODE[poster]]
- [CODE[data][data=""]]
- [CODE[cite][cite=""]]
- [CODE[itemtype]]
- [CODE[itemprop]]
- [CODE[xmlns]]
- [CODE[<meta http-equiv=Refresh>]]
- [CODE[Location][window.location]]
-- [CODE[location.href]]
-- [CODE[location.assign]]
-- [CODE[location.replace]]
- [CODE[document.URL]]
- [CODE[documentURI]]
- [CODE[baseURI]]
- [CODE[window.open]]

[HISTORY[
- [CODE[code][code=""]]
- [CODE[codebase]]
- [CODE[archive][archive=""]]
- [CODE[rel][rel=""]]
- [CODE[profile][profile=""]]
- [CODE[longdesc]]
- [CODE[showModalDialog]]
- [[システム識別子]]
]HISTORY]
]FIG]

* 歴史

[21] 
[CITE[[[HTML5]]]] と [CITE[[[URL Standard]]]] まで、
[[HTML]] における [[URL]] の定義は混乱した状況にありました。
(これは [[HTML]] 特有の事情ではなく [[URL]] というもの自体が混乱していました。)


** HTML4

[1] HTML 4 では、[CODE[URI]] という語を
[URI] で定義されている意味で使います。と
<IW:HTML4:"types.html#type-uri"> に書いてあります。
[URI] は HTML 4.01 では [[RFC 2396]]
のことです。

と、これはちょっと困ったことになります。
RFC 2396 では [CODE[[[URI]]]] と [CODE[[[URI参照]]]]を区別しているのです。
RFC 2396 の4章によれば、 URI 参照から[[素片識別子]]を取り除き、
[[相対URI]] は解決して得た[[絶対URI]] こそが
[CODE[the URI]] であるというのです。
これじゃあ、 HTML 4 でたとえば [CODE(HTMLa)[[[href]]]]
属性に相対 URI も素片識別子も使えなくなっちゃう。。。

[2] URI の紹介のところ <IW:HTML4:"intro/intro.html#h-2.1">
では相対 URI も素片識別子も含めて URI と言っています。
これが本来の意図であることは明らかです。
下手に RFC を参照せずにちゃんと説明しておけば良かったものを。。。

[3] まあ、 URI 関係の概念と名前は歴史的に泥々してますからあんまり責めちゃ可愛そうではあります。

ちなみに [[XHTML 1]] はちゃんと [CODE[URI 参照]]と書いていたりします。。。

*** %URI; 型 (HTML 4)

[4] HTML 4 では、 [CODE(SGML)[%URI;]]
型の属性の値は [DFN[URI]] (>>1) です。

[5] 仕様書:
- [[HTML 4]]
-- <IW:HTML4:"types.html#type-uri">
-- [[厳密DTD]] <IW:HTML4:"sgml/dtd.html#URI">
-- [[移行用DTD]] <IW:HTML4:"sgml/loosedtd.html#URI">
-- [CITE[B.10 Notes on security]]
<IW:HTML4:"appendix/notes.html#notes-security">
-[[XHTML 1.0]]
-- [CSECTION[A.1.1. XHTML-1.0-Strict]]
<http://www.w3.org/TR/2002/REC-xhtml1-20020801/dtds.html#dtdentry_xhtml1-strict.dtd_URI>
-- [CSECTION[A.1.2. XHTML-1.0-Transitional]]
<http://www.w3.org/TR/2002/REC-xhtml1-20020801/dtds.html#dtdentry_xhtml1-transitional.dtd_URI>
-- [CSECTION[A.1.3. XHTML-1.0-Frameset]]
<http://www.w3.org/TR/2002/REC-xhtml1-20020801/dtds.html#dtdentry_xhtml1-frameset.dtd_URI>
- [[XHTML m12n]]
--[CSECTION[4.3. Attribute Types]]
<IW:XHTML1m12n:"abstraction.html#dt_URI">

[[HTML 4.01]] も [[XHTML m12n]] も [[RFC 2396]] を参照しています
(>>1) が、
[[RFC 1738]] や [[RFC 1808]] も参考文献一覧にしぶとく残っています。

[6]
URI は一般に大文字・小文字を区別します。
部分部分は区別しないこともありますが、全体としては区別します。

*** 非 ASCII 文字

[7] HTML 4 附属書 B (参考) には、 URI 属性値の非 ASCII 
文字の取り扱いについての推奨事項が書かれています。

- HTML 4 [CITE[B.2.1 Non-ASCII characters in URI attribute values]]
<IW:HTML4:"appendix/notes.html#non-ascii-chars">

要点:
- URI は非 ASCII 文字を含みませんが、著者は [CODE(SGML)[%URI]]
属性値に非 ASCII 文字を含む URI のようなものを指定しちゃいます。
-- '''違法'''な例: [SAMP(HTML)[<A href="http://foo.example/ハーコン">...</A>]]
[SRC[HTML 4 B.2.1 改]]
- UA は非 ASCII 文字を次の通り変換することを[RUBYB[推奨][recommend]]します。
-= [[UTF-8]] ([[RFC 2279]]) で表現する
-= 問題のバイトを [[URI符号化]]する
- こうすれば、 HTML 文書の[[文字符号化]]とは独立な、
構文的に合法の URI ([[RFC 1738]] + [[RFC 2141]]) を生成できます。
- 古い UA は URI を受信した文書符号化で処理します。
古い HTML 文書はこれに依存していて、文書の符号を変換するとおかしくなります。
-- 古い文書も扱いたい UA は、合法でない文字を含む URI
を受信したら、最初に UTF-8 にしてみて、
うまくいかなかった時だけ元の符号化を使ってみるべきです。
- [CODE(HTMLa)[[[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]])、 [Q[older]] とかお茶を濁すのではなく、
もうちょっと丁寧に現状を説明するべきだったのではないでしょうか。
- [CODE(HTMLa)[name]] 属性云々は意味不明です。[[素片識別子]]として使う時は
UTF-8 + URI 逃避符号化せよという意味でしょうか。

** アンド記号の入った URI

[9] HTML 4 は、次のように述べています。
> [[フォーム]]の[[提出]]で構築される [[URI]] は、
[CODE(HTMLe)[[[a]]]] [CODE(HTMLa)[[[href]]]] などでも使うことがあります。
運が悪くも [CODE(char)[&]] をフォーム欄の分離子に使うと[[属性値表記]]の中で逃避して
[SAMP(SGML)[&amp;]] のように書かなければなりません。
> [[HTTP]] 鯖実装者と特に [[CGI]] 実装者は、
[CODE(char)[&]] の代わりに [CODE(char)[;]] を使うのにも対応することを推奨します。

HTML 4 [CITE[B.2.2 Ampersands in URI attribute values]]
<IW:HTML4:"appendix/notes.html#ampersands-in-uris"> より要約

[10] この規定に触発されたのかどうかは知りませんが、
最近では [[CGIスクリプト]]の実装で [CODE(char)[&]] と
[CODE(char)[;]] を等しく [CODE(ABNF)[[[query]]]] 
の分離子とみなすのが普通になっているようです。

(HTTP や CGI の鯖がそう実装しているのは見たことがありません。
というか HTTP や CGI の鯖が [CODE(ABNF)[query]]
を解釈するのは見たことがありません。。。)

ただ、 [CODE(HTMLe)[[[form]]]] 要素の属性か何かで
[[XForms]] のように [CODE(MIME)[[[application/x-www-form-urlencoded]]]]
の分離子を指定する方法を用意しておけば、
もっと広がったのではないかと思いますのに残念です。
フォームの提出時とアンカーをたどった時とで URI
の形が変わってしまうのは、なんとも美しくありません。

** XDM

[12] [CITE@en[XSLT 2.0 and XQuery 1.0 Serialization (Second Edition)]]
( ([TIME[2010-12-17 00:08:20 +09:00]] 版))
<http://www.w3.org/TR/2010/REC-xslt-xquery-serialization-20101214/#uri-attribute-values>

[13] [CITE@en[XSLT 2.0 and XQuery 1.0 Serialization (Second Edition)]]
( ([TIME[2010-12-17 00:08:20 +09:00]] 版))
<http://www.w3.org/TR/2010/REC-xslt-xquery-serialization-20101214/#list-of-uri-attributes>

[14] [CITE@en[XSLT and XQuery Serialization 3.0]]
( ([TIME[2014-04-07 23:19:15 +09:00]] 版))
<http://www.w3.org/TR/xslt-xquery-serialization-30/#list-of-uri-attributes>

[15] [CITE@en[XSLT and XQuery Serialization 3.0]]
( ([TIME[2014-04-07 23:19:15 +09:00]] 版))
<http://www.w3.org/TR/xslt-xquery-serialization-30/#uri-attribute-values>

[16] [CITE@en[XSLT and XQuery Serialization 3.0]]
( ([TIME[2014-04-07 23:19:15 +09:00]] 版))
<http://www.w3.org/TR/xslt-xquery-serialization-3/#uri-attribute-values>

[17] [CITE@en[XSLT and XQuery Serialization 3.0]]
( ([TIME[2014-04-07 23:19:15 +09:00]] 版))
<http://www.w3.org/TR/xslt-xquery-serialization-3/#list-of-uri-attributes>

** XHTML2

[11] [[XHTML2]] の最初の[[作業原案]]では [[XML Schema]] 第1版[[勧告]]の
[CODE(XML)@en[[[anyURI]]]] であるとされていました。

;; [CITE@en[- Module Definition Conventions]] ([TIME[2002-08-06 00:20:43 +09:00]] 版) <http://www.w3.org/TR/2002/WD-xhtml2-20020805/abstraction.html#dt_URI>

** HTML5 以後

[19] [[URL Standard]] 参照。


[20] [CITE@en[XSLT and XQuery Serialization 3.1]]
([TIME[2017-03-20 12:35:18 +09:00]])
<https://www.w3.org/TR/2017/REC-xslt-xquery-serialization-31-20170321/#uri-attribute-values>