サイトのトップへ戻る

Twitter 開発者 ドキュメント日本語訳

パラメータをパーセントエンコードする

このページではRFC 3986, Section 2.1で説明されているURLエンコード処理について記載しています。 このドキュメントにあいまいな点や矛盾する点があった場合は、RFC 3986の仕様の方を参照してください。



概要

Twitter APIの一部、特にOAuth 署名を扱うAPIは、 RFC 3986, Section 2.1に従ってエンコードされた文字列が必要です。 多くのURLエンコードアルゴリズムの実装はRFC 3986と完全に互換性があるわけではないので、誤ったエンコードをするとOAuth 署名でたくさんのエラーが発生してしまいます。 そのため、このページでは正確な署名アルゴリズムについて説明しています。



文字列をエンコードする

このアルゴリズムでは、コピー元文字列の値をバイトごとに コピー先文字列へコピーしてエンコードするやり方を想定しています。

ステップ 1: コピー元文字列にまだ読み込まれていないバイトがあった場合、コピー元文字列から次のバイト(8 ビット) を読み込みます。 通常はこれで1文字分と見なされますが、1バイトを超えることがある文字(UTF-8のような)の場合は、最初のバイトを読み込むだけにして下さい。

ステップ 2: 読み込んだバイトが以下の ASCII equivalentsと一致するかどうか確認してください。以下の表では読みやすいように行を分けていますが、特定の行だけではなく表全体を見て、読み込んだバイトがあるかどうかを判断する必要があります。

Name ASCII characters Equivalent byte values
数字 '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

ステップ 2a: 読み込んだバイトが上記表に記載されていた場合は、それをコピー先文字列にコピーしてステップ 1.へ戻ります。 上記表にある文字はエスケープする必要がないので、読み込んだバイトを直接コピーするだけで良いです。

ステップ 2b: 読み込んだバイトが上記表にない場合は、処理を続けます。 上記表の値以外はエンコードをする必要があります。

ステップ 3: コピー先文字列に ‘%’ 文字を記載します。 このパーセント文字 ‘%’ (もしくは16進数の0x25 とバイナリの00100101) は、次の2バイトはエンコードされたバイトであることを示します。

ステップ 4: Write two characters representing the uppercase ASCII-encoded hex value of the current byte to DST. これは少しややこしいので、例を出します。現在のバイトが 0xE6 (バイナリの11100110 )と仮定します。これは UTF-8 エンコードされた ‘æ’の値と対応します。 この値をエンコードするには、コピー先文字列に文字‘E’(0x45, from the table above)を記載し、それから文字‘6’(0x36)を記載します。 最後に記載する3文字は“%E6”となる必要があります。A,B,C,D,E,Fなどを記載する場合は、大文字を使わなければならないので注意してください。

ステップ 5: ステップ 1へ戻ります。コピー元文字列を全てコピー先文字列へコピーするまでこの操作を続けます。



RFC3986 に準拠したエンコード機能

以下の表は、いくつかのプログラム言語でのRFC3986 実装へリンクしています。

言語 メソッド
Java net.oauth.OAuth.percentEncode
PHP rawurlencode
Ruby OAuth::Helper::escape

あなたが使っているプログラム言語がこの一覧にない場合、このOAuth ライブラリのページをチェックしてあなたのプログラム言語で書かれたライブラリがないか確認し、そのソースコードを見て勉強してください。全ての有効なOAuth ライブラリではパーセントエンコーディングを実装しているはずです。



以下の例は、あなたのコードで出力された文字列との比較に使えるかもしれません。 You should consider any differences an error. Spaces encoded as “+” characters are an example of incorrect encoding.

元の文字列 エンコードされた文字列
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