メインコンテンツへスキップ

パーセントエンコードのパラメータ

X API の一部、特に OAuth 署名を扱う部分では、文字列を RFC 3986, Section 2.1 に従ってエンコードする必要があります。URL エンコードアルゴリズムの多くの実装は RFC 3986 と完全には互換性がないため、不適切なエンコードが多くの OAuth 署名エラーの原因となります。そこで、本ページでは使用すべき正確な署名アルゴリズムについて説明します。 本ページでは、RFC 3986, Section 2.1 に記載された URL エンコード手順を扱います。あいまいな点や本書との不一致がある場合は、当該仕様を参照することを推奨します。  

文字列のエンコード

次のアルゴリズムは、文字列 SRC の値をバイト単位で文字列 DST にコピーしてエンコードすることを前提としています。 手順 1: SRC に未読のバイトがある間、SRC から次のバイト(8 ビット)を読み取ります。 一般的にはこれは文字とみなされますが、1 文字が複数バイトになり得るエンコーディング(UTF-8 など)の場合は、最初の 1 バイトのみを読み取ってください。 手順 2: 読み取ったバイトが次の ASCII のいずれかに該当するか確認します。 次の表は可読性のため行を分けていますが、判断すべきなのは読み取ったバイトが表内に存在するかどうかだけであり、どの行かまで特定する必要はありません。
名称ASCII 文字対応するバイト値
数字‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39
英大文字‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’0x41, 0x42, 0x43, 0x44, 0x45,0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58, 0x59, 0x5A
英小文字‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’0x61, 0x62, 0x63, 0x64, 0x65,0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,0x72, 0x73, 0x74, 0x75, 0x76, 0x77,0x78, 0x79, 0x7A
予約文字‘-‘, ‘.’, ‘_’, ‘~’0x2D, 0x2E, 0x5F, 0x7E
手順 2b: バイトが上記の表にない場合は続行します。 その他の値は必ずエンコードする必要があります。 手順 2a: バイトが上記の表にある場合は、それを DST にコピーして手順 1 に戻ります。 上記の表に挙げた文字はエスケープ不要のため、そのままバイトをコピーします。 手順 3: 文字 ‘%’ を DST に書き込みます。 パーセント記号 ‘%’(16 進で 0x25、2 進で 00100101)は、次の 2 文字がエンコード済みバイトを表すことを示します。 手順 4: 現在のバイトの大文字の ASCII で表した16 進値に対応する 2 文字を DST に書き込みます。 例で説明します。現在のバイトが 0xE6(2 進で 11100110)だとします。これは ‘æ’ の UTF-8 での値に対応します。この値をエンコードするには、文字 ‘E’(上の表の 0x45)を書き、その後に文字 ‘6’(0x36)を書きます。直近に書き込まれる 3 文字は “%E6” になります。A、B、C、D、E、F といった文字を書く場合は、必ず大文字を使用してください。 手順 5: 手順 1 に戻ります。 SRC 全体が DST にコピーされるまで続けます。  

以下の例は、ご自身のコードの出力と比較する際に役立ちます。差異はすべてエラーと見なしてください。スペースを「+」文字としてエンコードするのは、誤ったエンコードの例です。
元の文字列エンコード後の文字列
Ladies + GentlemenLadies%20%2B%20Gentlemen
An encoded string!An%20encoded%20string%21
Dogs, Cats & MiceDogs%2C%20Cats%20%26%20Mice
%E2%98%83
I