Skip to main content

パーセントエンコーディングパラメーター

X API の一部、特に OAuth 署名を扱う箇所では、文字列を RFC 3986, Section 2.1 に従ってエンコードする必要があります。URL エンコーディングアルゴリズムの多くの実装は RFC 3986 と完全に互換ではないため、不正なエンコーディングが多くの OAuth 署名エラーの原因となっています。そのため、使用すべき厳密な署名アルゴリズムをこのページで扱います。 このページでは、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 バイトがエンコードされたバイトを表すことを示します。 ステップ 4: 現在のバイトの大文字 ASCII エンコードされた 16 進数値を表す 2 文字を DST に書き込む。 これは少し分かりにくいので、例を示します。現在のバイトが 0xE6 (2 進数で 11100110) だとします。これは ‘æ’ の UTF-8 エンコード値に対応します。この値をエンコードするには、DST に文字 ‘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