パーセントエンコードのパラメーター
Twitter APIの一部、特にOAuth署名を扱うものは、RFC 3986のセクション2.1に従って文字列をエンコードする必要があります。URLエンコーディングアルゴリズムの実装の多くはRFC 3986と完全互換ではないため、エンコーディングが不正となり、多くのOAuth署名エラーの原因となります。このような理由から、このページでは、使用できる確実な署名アルゴリズムを説明します。
このページでは、RFC 3986のセクション2.1に記載されているURLエンコード処理について説明します。曖昧な点や本書との矛盾がある場合には、その仕様を参照してください。
文字列のエンコード
以下のアルゴリズムは、文字列SRCの値をバイト単位で文字列DSTにコピーしてエンコードすると想定しています。
手順1:SRCにまだ読み取っていないバイトが含まれている場合は、SRCからの次のバイト(8ビット)を読み取ります。 通常、これは1文字と見なされますが、1文字が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、バイナリーでは00100101)は、次の2バイトがエンコードされたバイトを表すことを示します。
手順4:現在のバイトの大文字のASCIIエンコードされた16進数を表す2文字をDSTに書き込みます。 これは少し分かりづらいため、例を挙げます。現在のバイトが0xE6(バイナリーは11100110)であると仮定します。これは、「æ」のUTF-8エンコード値に対応します。この値をエンコードするには、文字「E」(上の表の0x45)をDSTに書き込んだ後、文字「6」(0x36)をDSTに書き込みます。書き込まれる最後の3文字は「%E6」である必要があります。A、B、C、D、E、Fなどの文字を書く場合は、必ず大文字を使用してください。
手順5:手順1に戻ります。 SRC全体がDSTにコピーされるまで続けます。
例
以下の例は、自分のコードの出力と比較する際に役立ちます。なんらかの違いがあればエラーと見なす必要があります。「+」文字としてエンコードされたスペースは、誤ったエンコードの例です。
元の文字列 | エンコードされた文字列 |
---|---|
Ladies + Gentlemen | Ladies%20%2B%20Gentlemen |
An encoded string! | An%20encoded%20string%21 |
Dogs, Cats & Mice | Dogs%2C%20Cats%20%26%20Mice |
☃ | %E2%98%83 |