[14] かつての [[URL]] の仕様では [[reserved]] / [[unreserved]] の違いがありました。 [[unreserved]] は、[[パーセント符号化]]してもしなくても同じ意味である[[文字]]でした。 ;; [15] [[URL Standard]] には [[reserved]] / [[unreserved]] の区別はありません。 * 定義 [1] [[RFC1738]], [[RFC1808]] では: - unreserved = alpha | digit | safe | extra - safe = "$" | "-" | "_" | "." | "+" - extra = "!" | "*" | "'" | "(" | ")" | "," 結局、 - [CODE(ABNF)[rfc1738.unreserved = <[A-Za-z0-9$_.+!*'(),-]>]] - rfc1808.unreserved = rfc1738.unreserved 一方、 [[RFC2396]] では - [CODE(ABNF)[rfc2396.unreserved = <[A-Za-z0-9_.!~*'()-]>]] で、 [CODE(URI)[[[$]]]], [CODE(URI)[[[+]]]], [CODE(URI)[[[,]]]] が消えて、 [CODE(URI)[[[~]]]] が追加されました。 削除されたものは [[reserved]] へ移動、追加されたものは [[national]] からの編入です。 ;; [CITE@en[Compare character sets "$rfc1738:unreserved" and "$rfc2396:unreserved"]] ([TIME[2013-10-28 09:59:58 +09:00]] 版) [10] [[RFC 2396]] と [[RFC 3986]] と比べると5文字 [[sub-delims]] に移動しています。 [REFS[ - [8] [CITE@en[Compare character sets "$rfc2396:unreserved" and "$rfc3986:unreserved"]] ([TIME[2013-10-28 10:01:19 +09:00]] 版) - [9] [CITE@en[Compare character sets "'''['''!'-*''']'''" and "$rfc3986:sub-delims"]] ([TIME[2013-10-28 10:01:46 +09:00]] 版) ]REFS] * HTTP での定義 [3] [[RFC2068]] では: - unreserved = ALPHA | DIGIT | safe | extra | national 結局、 - rfc2068.unreserved = [[OCTET]] - (%x00-20 / <"> / "#" / "%" / "<" / ">") 随分おおざっぱな定義ですが、 [[pchar]>>3] 参照。 * IRI [12] [[RFC 3986]] [CODE(ABNF)@en[[[reserved]]]] と [[RFC 3987]] [CODE(ABNF)@en[[[iunreserved]]]] の違いは [CODE(ABNF)@en[[[ucschar]]]] です。 [REFS[ - [11] [CITE@en[Compare character sets "$rfc3986:unreserved" and "$rfc3987:iunreserved"]] ([TIME[2013-10-28 10:02:45 +09:00]] 版) ]REFS] * bidi 文字 [6] [[IRI]] ([[RFC 3987]]) では [[bidi]] の表示の制御に関わる[[文字]] [CODE(charname)@en[[[LRM]]]], [CODE(charname)@en[[[RLM]]]], [CODE(charname)@en[[[LRE]]]], [CODE(charname)@en[[[RLE]]]], [CODE(charname)@en[[[LRO]]]], [CODE(charname)@en[[[RLO]]]], [CODE(charname)@en[[[PDF]]]] ([CODE(char)[[[U+200E]]]], [CODE(char)[[[U+200F]]]], [CODE(char)[[[U+202A]]]]-[CODE(char)[[[U+202E]]]]) の利用が禁じられています。しかし、この制限はなぜか [[ABNF]] に反映されておらず、[[未予約文字]]であるかのようにも見えます。 ([[RFC 3987]] 4章の本文で禁止されています。) [REFS[ - [13] [CITE@en[Character set "$rfc3987:iunreserved - $rfc3987:bidi-disallowed"]] ([TIME[2013-10-28 10:03:57 +09:00]] 版) ]REFS] [7] [[IRI]] を参照する仕様の中には、「[[RFC 3987]] の [[ABNF]] 構文に合致するもの」のような引用の仕方のものがあり、その場合に >>6 の制約が適用されるのか不明です。 * 仕様書から ** RFC 2396 *** 2.3. Unreserved Characters > Data characters that are allowed in a URI but do not have a reserved purpose are called unreserved. These include upper and lower case letters, decimal digits, and a limited set of punctuation marks and symbols. URI で認められているが[[予約]]目的を持たないデータ文字を[DFN[[[非予約]]]]と呼びます。 これには大文字と小文字, 10進数字, 嗅ぎられた句読点印・記号の集合を含みます。 > - unreserved = alphanum | mark - mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" > Unreserved characters can be escaped without changing the semantics of the URI, but this should not be done unless the URI is being used in a context that does not allow the unescaped character to appear. 非予約文字は URI の意味を変えることなく [[escape]] することが出来ますが、 このことは URI がその非予約文字の出現が許されない文脈で使われるのでない限りするべきではありません。 *** G.2 (抜粋) > The tilde "~" character was added to those in the "unreserved" set, since it is extensively used on the Internet in spite of the difficulty to transcribe it with some keyboards. [[チルダ]] [CODE(URI)[[[~]]]] 文字を「非予約」集合に加えました。 この文字は転写し辛い鍵盤があるにもかかわらずインターネットで広く用いられているからです。 * RFC の部分の License [[RFCのライセンス]] * 関連 - [[予約文字]] - [[非安全文字]] - [[百分率符号化]] * メモ - [2] [CODE(URI)[~]] が追加されたのは、 のような使用が非常に広く行われており、追認せざるを得なかったからです。本来はこの文字は national に分類されていたように存在しない[[符号化文字集合]]が多い (その最たる例は日本の[[シフトJIS]]。厳密にはシフト JIS で生チルダを含む URI は書けません。) ですし、容易に入力できない鍵盤・入力方式も少なくありませ。 (日本では [[WWW]] の普及後雑誌や[[掲示板]]などで [CODE(char)[~]] の入力方法についての記事や質問が激増しました。) [4] [[RFC 3986]] まで一貫して [CODE(URI)[.]] は非予約文字に分類されてきました。 ということは [CODE(URI)[.]] と [CODE(URI)[%2E]] は [WEAK[(許されている場所では)]] 常に等価です。 ところで、 [CODE(URI)[.]] または [CODE(URI)[..]] だけの [[path]] [[segment]] は特別な意味を持ちます。 [WEAK[(その扱いの詳細は RFC 3986 で明確化されています。)]] 従って、 path segment で特別な意味を持たない [Q[.]] や [Q[..]] を使おうと思っても、その方法は存在しないということになります。 ([[名無しさん]]) [5] >>4 はファイル・システムでは普通 [WEAK[(ファイル・システムでも [CODE(file)[.]] や [CODE(file)[..]] を特別な意味に割り当てていることが多いので)]] 問題になりませんが、ファイル・システム以外のデータベース [WEAK[(たとえば任意の [[WikiName]] が使える [[wiki]])]] を URI path に写像する場合に問題となり得ます。 回避策としては、 URI で特別な意味を持つのが [Q[.]] や [Q[..]] ''だけ''で構成される path segment であるということから、それ以外の文字を混ぜてやれば、というのが1つ考えられます。 [[URI scheme]] の定義に依存しますが、 空の[[引数]]があると仮定した [CODE(URI)[.;]] や [CODE(URI)[..;]] のような path segment を使うのが一番ましな設計かもしれません。 ([[名無しさん]])