第25回 外部実体における統一資源識別子(URI) Page 3

川俣 晶
株式会社ピーデー
2004/9/8

URIにおける文字の別扱い

 次は、URIに使用される文字を別扱いすることについて書かれている。

System identifiers (and other XML strings meant to be used as URI references) MAY contain characters that, according to [IETF RFC 2396] and [IETF RFC 2732], must be escaped before a URI can be used to retrieve the referenced resource. The characters to be escaped are the control characters #x0 to #x1F and #x7F (most of which cannot appear in XML), space #x20, the delimiters '<' #x3C, '>' #x3E and '"' #x22, the unwise characters '{' #x7B, '}' #x7D, '|' #x7C, '\' #x5C, '^' #x5E and '`' #x60, as well as all characters above #x7F. Since escaping is not always a fully reversible process, it MUST be performed only when absolutely necessary and as late as possible in a processing chain. In particular, neither the process of converting a relative URI to an absolute one nor the process of passing a URI reference to a process or software component responsible for dereferencing it SHOULD trigger escaping. When escaping does occur, it MUST be performed as follows:

システム識別子(およびほかの統一資源識別子(URI)参照として使用されるXML文字列)が含む文字のいくつかは、[IETF RFC 2396]および[IETF RFC 2732]に従えば、参照された資源を得るために統一資源識別子(URI)を使用する前に別扱いする必要がある。これらの別扱いが必要な文字は、#x0から#x1Fまでの制御文字(そのほとんどはXMLでは出現できない。)、スペース#x20、区切り子('<' #x3C、 '>' #x3Eおよび '"' #x22)、unwise文字( '{' #x7B、 '}' #x7D、 '|' #x7C、 '\' #x5C(バックスラッシュ)、'^' #x5Eおよび '`' #x60)ならびに #x7Fを超える文字とする。別扱いは常にまったく可逆的な処理であるというわけではないので、絶対に必要なときに限って、できるだけ後の段階で別扱いを行うものとする。特に、相対的な統一資源識別子(URI)を絶対的なものに変換する処理は、別扱いを起動しないことが望ましい。統一資源識別子(URI)参照を参照するプロセスまたはソフトウェア部品に統一資源識別子(URI)参照を渡す処理も、別扱いを起動しないことが望ましい。別扱いが本当に起きるときは、次のとおり行わなければならない。

 では順番に見ていこう。最初の文は、例えば以下のようなURIを使って参照することはできないことを示している。

http://sample/sample.xml?p=あいうえお

 平仮名は別扱いしなければならないためである。そのため、使用できない文字を別扱いして、以下のような表記に直して使用しなければならない。

http://sample/sample.xml?
p=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
(※本来は1行ですが、表示の都合で改行しています)

 この文章で述べていることは、使用する前にこのような表記に置き換える必要があるということである。

 次の文章では別扱いが必要な文字について記されているが、ここにリストアップされた文字と、URIのRFCで規定された別扱いすべき文字のリストが一致しないことに注意が必要である。その理由は筆者には分からないのだが、規定の重要度は、URIを利用しているだけに過ぎないXML 1.0勧告よりもまさにそれを規定するRFC 2396とRFC 2732の方が重いのではないかと思う。

 次の文章で述べられている可逆的な処理とは、変換して逆変換すると完全に同じデータに戻るもののことをいう。例えば、Base64エンコードは可逆的である。US-ASCII表記の文字列「ABC」をBase64エンコードすると「QUJD」という文字列になり、これをデコードすると元のUS-ASCII表記の文字列「ABC」に確実に戻る。それに対して、URIの別扱いは可逆的ではない。例えば、URIの一部として「%41」という表記があったとして、それが最初から「%41」であったのか、それとも「A」という文字を(本来は必要ないが)別扱いするために%41という表記に置き換えられたのか、その区別がつかない。それ故に、本来の表記をできるだけ維持するためには、この文章に書かれているように、必要なときに限り、できるだけ後の段階で別扱いの処理を行うことが必要とされる。

 次に、相対URIにアクセスする場合、それを絶対URIに変換する処理が行われる場合があると述べられている。しかし、その際、文字を別扱いする処理は行わない方がよい、ということである。基本的に、相対URIを絶対URIに変換するだけであれば、文字が別扱いされているか否かは(少数の最低限のURI表記に必須の記号を除き)まったく意味を持たない。であれば、別扱いの処理を行うことなく変換を行う方が、よりトラブルが起きにくいといえる。

 次の「統一資源識別子(URI)参照を参照するプロセスまたはソフトウェア部品」というのはどのようなものだろうか。例えば、プロセスというのは、通信処理を行ってくれる独立したプログラムなどが想定される。例えば、プログラムからアクセス可能なインターフェイスを持つWebブラウザのようなソフトがあるかもしれないが、そのようなプログラムを実行しているプロセスに対して「このURIのファイルを入手してください」という依頼を行うような作り方があるかもしれない。また、ソフトウェア部品というのはクラスライブラリのようなものを示すと思うと分かりやすいだろう。例えば、.NET Frameworkでいえば、URIを指定してファイルのダウンロードなどを行うことができるSystem.Net.WebClientクラスなどがこれに当たる。これらのクラスにURIを渡す場合、別扱いの処理は行わない方が望ましいということである。別扱いを行わないで引き渡す効能はいくつか考えられる。例えば、引き渡されたクラスでエラーが発生し、例外を発生させた場合、例外メッセージに問題を起こしたURIが含まれる場合がある。そのURIは、大抵の場合、クラスに引き渡したURIそのものになると思う。別扱いせずにURIを渡していれば、実体宣言中に記述されたとおりのURIが表示され、問題の原因調査がやりやすいということがあるかもしれない。

文字の別扱いの手順

 次の文章にある「次」とは、この次に記述されている3つの項目である。別扱いを行う場合は以下の手順で行え、ということである。

  1. Each character to be escaped is represented in UTF-8 [Unicode3] as one or more bytes.

  2. The resulting bytes are escaped with the URI escaping mechanism (that is, converted to %HH, where HH is the hexadecimal notation of the byte value).

  3. The original character is replaced by the resulting character sequence.

  1. 別扱いされる文字は、それぞれUTF-8 [Unicode3] に従って1バイトまたはそれ以上のバイトに変換される。

  2. 結果として得られるバイト列はすべて、統一資源識別子(URI)の別扱いメカニズムによって別扱いする(つまり、%HHに変換される。ここでHHはバイト値の16進表記とする。)。

  3. 元の文字は、この結果として得られる文字列に置き換える。

 上記の3つの項目は、「JIS X 4159」では1、2、3ではなくa、b、cと表記されているが、これは文書のルールの相違であって、本質的な相違ではない。

 さて、最初は、URIを別扱いする処理は、文字をコードの16進数表記に置き換える作業なので、どのようなバイト表現に置き換えるかは重要な意味を持つ。相互運用性を維持するためには、こちらのシステムはシフトJISだが、あちらのシステムはEUC-JPを使うといった不統一は認められない。ここでは、UTF-8を使うということをはっきり明示することで、不統一を回避している。

 次は、%記号に続いて16進数2けたを記述するというURIの別扱い表記を使用することを示している。例えば、平仮名の「あ」であれば、16進数表記のE3 81 82という3バイト(1バイト8bitとして)の並びになる。これを別扱いの表記で記述すると「%E3%81%82」となる。

 最後の文章では、もともと書き込まれていた文字は消えてなくなり、その代わりに別扱いされた文字列が入ると述べられている。例えば「あ」は「%E3%81%82」に置き換えられるわけである。

 これでシステム識別子とURIの話題は終わりである。

3/4

 Index
やさしく読む「XML 1.0勧告」 第25回
外部実体における統一資源識別子(URI)
  Page 1
・外部実体の後半
・システム識別子の定義
  Page 2
・統一資源識別子(URI)
・URIのリダイレクト
Page 3
・URIにおける文字の別扱い
・文字の別扱いの手順
  Page 4
・公開識別子(Public identifier)の定義
・外部実体宣言の例


連載 やさしく読む「XML 1.0勧告」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間