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

パーセントエンコードされたパラメータ

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

文字列のエンコード

次のアルゴリズムでは、文字列 SRC を、値を 1 バイトずつコピーして文字列 DST にエンコードすることを前提としています。 ステップ 1: SRC に未読のバイトが含まれている間、SRC から次のバイト(8 ビット)を読み込みます。 通常これは 1 文字と見なされますが、UTF-8 のように 1 文字が複数バイトになり得るエンコーディングでは、最初の 1 バイトだけを読み込みます。 ステップ 2: 読み込んだバイトが、以下の ASCII に相当するいずれかと一致するか確認します。 次の表は可読性のために行ごとに分けられていますが、判定する必要があるのは、読み込んだバイトが表のどこかに存在するかどうかであり、どの行にあるかではありません。
NameASCII charactersEquivalent byte values
Digits‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39
Uppercase letters‘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
Lowercase letters‘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
Reserved characters‘-‘, ‘.’, ‘_’, ‘~’0x2D, 0x2E, 0x5F, 0x7E
ステップ 2b: バイトが上記の表に記載されていない場合、次の手順に進みます。 それ以外の値はすべてエンコードする必要があります。 ステップ 2a: バイトが上記の表に記載されている場合、そのバイトを DST にコピーし、ステップ 1 に戻ります。 上記の表に記載されている文字はエスケープ不要なので、バイトをそのままコピーします。 ステップ 3: 文字 ‘%’ を DST に書き込みます。 パーセント文字 ‘%’(16 進数で 0x25、2 進数で 00100101)は、次の 2 文字がエンコードされた 1 バイトを表すことを示します。 ステップ 4: 現在のバイトの、ASCII の大文字による 16 進表記を表す 2 文字を DST に書き込みます。 これはやや分かりにくいので、例を示します。現在のバイトが 0xE6(2 進数で 11100110)だとします。これは ‘æ’ の UTF-8 エンコード値に相当します。この値をエンコードするには、文字 ‘E’(上の表では 0x45)と、その後に文字 ‘6’(0x36)を DST に書き込みます。最後に書き込まれる 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