3.7 パーセントエンコード
HTTPプロキシ形式(3.4.4 HTTPプロキシ形式参照)やHTTP APIの呼び出し(10.3 DOI REST APIのリクエスト(要求)/レスポンス(応答)フォーマット参照)など、DOI名がURLのパスコンポーネントとして使用される場合は常に、RFC 3986で規定されたパーセントエンコードのアルゴリズムが適用されます。このアルゴリズムには、「『/』などのURL内で特別な意味を持つ文字との衝突を防ぐ」こと、および「非US-ASCII文字をUS-ASCII文字のシーケンスにマッピングする」ことという2つの目的があります。
DOI名のパーセントエンコード表現は、まずプレフィックスとサフィックスのそれぞれに対して、個別に以下のアルゴリズムを適用することで形成されます。
- DOIプレフィックスまたはサフィックスのUnicodeコードポイントの順序付けられたシーケンスを、UTF-8文字列(3.6 UTF-8によるシリアル化参照)として表現します。この際、バイト順マーク(BOM)は付加せず、正規化も行いません。
- そのUTF-8文字列の各バイトに対して、以下の処理を行います。
- バイトが以下のいずれかである場合は、そのバイトをそのまま出力します:
ALPHA(英字)、DIGIT(数字)、-、.、_、~、!、$、&、'、(、)、*、+、;、=、:、@ - それ以外の場合は、そのバイトをパーセントエンコードし、得られたUS-ASCIIの3文字(バイトトリプレット)に置き換えます。
- バイトが以下のいずれかである場合は、そのバイトをそのまま出力します:
次に、上記によりエンコードされたプレフィックスとサフィックスを、間に「/」を挟んで連結します。
なお、ALPHAおよびDIGITの文字セットはIETF RFC 3986で規定されています。
また、「,」バイトはパーセントエンコードされます。これは、パーセントエンコードされたDOI名を「Which RA?」サービスのリクエスト(5.6 Which RA?サービス参照)で使用できるようにするためです。
例: DOI名「10.1000/456#789」は、パーセントエンコードされると「10.1000/456%23789」になります。これにより、Webブラウザは(通常URLの終端およびフラグメントの開始として扱う)生の「#」を検出しなくなります。その結果、ブラウザは「#」で処理を止めず、文字列全体を解決(リゾルブ)のためにDOIサーバーネットワークへ送信します。