« コトノコの広辞苑用外字ファイル | トップページ | IRIの正規化(その2) »

2008.05.24

IRIの正規化

国際化URI (IRI) で触れていなかった問題に正規化の問題がある(IRIの詳細は前回の稿を参照いただきたい)。UCS (Unicode) は同じ文字を表す複数のコード列が存在するため、識別子として用いるためには正規化の必要がある。

IRI の規格である RFC 3987 では、正規化を次のように扱っている。

  • 印刷された IRI は NFC*1 で正規化されていると看做す (3.1)

  • Unicode 以外の文字コードで表されている場合は NFC で正規化して UTF-8 に変換する (3.1)

  • 一般に IRI は NFC で正規化されている事が推奨される (5.3.2.2)

扱いは明確なのだが、奥歯に物が挟まった感がある。実は、次のような決まりもある。

  • Unicodeで表現されたIRIは(それ以上)正規化してはならない (3.1)

単純に、「IRIは常にNFCで正規化されなければならない」と決めれば良いようなものだが、規格はそうなっていない。理由は明記されていないが次のような事情があったと推測される。

IRI は新しいプロトコル要素だが URI と相互に変換することによって運用される。具体例を挙げると、ブラウザは IRI を URI に変換した上で Web サーバに送らなければならない(HTTP上では IRI は送信する事ができない)。また、利便性のため、ブラウザは URI を IRI に変換して表示する事も許されている。つまり、IRI は URI の表現方法(ビュー)の一つと考える事ができる。

IRI が URI のビューに過ぎないとすれば、既存の URI を無視して定める事はできない。URI に対しては文字コードすら決まっておらず、当然、正規化の規定はない。つまり、URI はパーセントエンコーディングさえ行えば、まったく正規化しまいが NFD*2 で正規化しようが(Shift_JISで*3表そうが)自由という事になる。IRI は URI との往復変換で元に戻る事を保証する必要があるため、IRI だけで正規化を行う事ができない。つまり、既存の URI との互換のため正規化が義務づけられなかったと考えられる。

つまり、UTF-8 で表した(文字列をパーセントエンコーディングした)URI は IRI として us-ascii 以外の文字で表現しても良く、そのまま URI に変換した場合は元に戻る事が保証されている。しかし、その IRI を印刷した瞬間(あるいは Unicode 以外の文字コードに変換した瞬間)に NFC で正規化した事になり、元の URI が NFC で正規化されていなかった(ものをパーセントエンコーディングした)場合は元に戻る事はない。IRI を安全に印刷できるのは NFC の場合のみという事になる。

いずれにしても、IRI を使用する(記述する)場合は NFC で正規化するものだと思えば、ほぼ間違いないであろう*4

--------
*1: できるだけ短くなるように正規化した形式(正確には正規分解したのちに正規合成した形式)。
*2: 全ての合成文字を分解(正規分解)した形式。
*3: IRI は UTF-8 でエンコードされている事が前提である。従って Shift_JIS でエンコードされた URI はIRI に変換してもパーセントエンコーディングのママとなる。
*4: Unicodeの正規化そのものに関しては問題が残る。その件は続稿で考えたい。

« コトノコの広辞苑用外字ファイル | トップページ | IRIの正規化(その2) »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: IRIの正規化:

« コトノコの広辞苑用外字ファイル | トップページ | IRIの正規化(その2) »

最近のトラックバック

無料ブログはココログ

Googleアナリティクス

  • Googleアナリティクス