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

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

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

文字列のエンコード

次のアルゴリズムは、文字列 SRC の値をバイト単位でコピーして文字列 DST にエンコードすることを前提としています。 ステップ 1: SRC に未読のバイトがある間、SRC から次のバイト(8 ビット)を読み取ります。 一般的にはこれは文字と見なされますが、文字が複数バイトになり得るエンコーディング(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 文字がエンコードされた 1 バイトを表すことを示します。 ステップ 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