このページではRFC 3986, Section 2.1で説明されているURLエンコード処理について記載しています。 このドキュメントにあいまいな点や矛盾する点があった場合は、RFC 3986の仕様の方を参照してください。
Percent encoding parametersThis page covers the URL encoding process described in RFC 3986, Section 2.1. You should reference that specification in case of any ambiguity or conflict with this document. |
Twitter APIの一部、特にOAuth 署名を扱うAPIは、 RFC 3986, Section 2.1に従ってエンコードされた文字列が必要です。 多くのURLエンコードアルゴリズムの実装はRFC 3986と完全に互換性があるわけではないので、誤ったエンコードをするとOAuth 署名でたくさんのエラーが発生してしまいます。 そのため、このページでは正確な署名アルゴリズムについて説明しています。
OverviewParts of the Twitter API, particularly those dealing with OAuth signatures, require strings to be encoded according to RFC 3986, Section 2.1. Since many implementations of URL encoding algorithms are not fully compatible with RFC 3986, bad encodings are a cause of many OAuth signature errors. For this reason, the exact signing algorithm to use is covered on this page. |
このアルゴリズムでは、コピー元文字列の値をバイトごとに コピー先文字列へコピーしてエンコードするやり方を想定しています。
ステップ 1: コピー元文字列にまだ読み込まれていないバイトがあった場合、コピー元文字列から次のバイト(8 ビット) を読み込みます。 通常はこれで1文字分と見なされますが、1バイトを超えることがある文字(UTF-8のような)の場合は、最初のバイトを読み込むだけにして下さい。
ステップ 2: 読み込んだバイトが以下の ASCII equivalentsと一致するかどうか確認してください。以下の表では読みやすいように行を分けていますが、特定の行だけではなく表全体を見て、読み込んだバイトがあるかどうかを判断する必要があります。
Name | ASCII characters | Equivalent byte values |
---|---|---|
数字 |
'0', '1', '2', '3', '4', '5',
|
0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
|
大文字 |
'A', 'B', 'C', 'D', 'E', 'F',
|
0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
|
小文字 |
'a', 'b', 'c', 'd', 'e', 'f',
|
0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
|
予約文字 |
'-', '.', '_', '~'
|
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へ戻ります。コピー元文字列を全てコピー先文字列へコピーするまでこの操作を続けます。
Encoding a stringThe following algorithm assumes you are encoding a string SRC by copying its values byte-by-byte to a string DST. Step 1: While SRC contains unread bytes, read the next byte (8 bits) from SRC. Typically, this is considered a character, but in the case of encodings where a character may be more than one byte (such as UTF-8), just read the first byte. Step 2: Check whether the read byte matches any of the following ASCII equivalents. The following table has been broken down into rows for legibility, but you only need to determine whether the read byte exists in the table at all, not the specific row.
Step 2a: If the byte is listed in the above table, copy it into DST and go back to Step 1. Characters listed in the above table do not need to be escaped, so you will just copy the byte directly. Step 2b: If the byte is not listed in the above table, continue. Any other value must be encoded. Step 3: Write the character ‘%’ to DST. The percent character ‘%’ (or 0x25 in hex and 00100101 in binary) indicates that the next two bytes will represent an encoded byte. Step 4: Write two characters representing the uppercase ASCII-encoded hex value of the current byte to DST. This is a bit confusing, so here is an example. Pretend the current byte is 0xE6 (11100110 in binary). This corresponds with the UTF-8 encoded value of ‘æ’. To encode this value, write the character ‘E’ (0x45, from the table above) and then the character ‘6’ (0x36) to DST. The last three characters written should have been “%E6”. Note that if you write a letter such as A,B,C,D,E or F, you must use the uppercase character. Step 5: Return to Step 1. Keep going until the entirety of SRC is copied to DST. |
以下の表は、いくつかのプログラム言語でのRFC3986 実装へリンクしています。
言語 | メソッド |
---|---|
Java | net.oauth.OAuth.percentEncode |
PHP | rawurlencode |
Ruby | OAuth::Helper::escape |
あなたが使っているプログラム言語がこの一覧にない場合、このOAuth ライブラリのページをチェックしてあなたのプログラム言語で書かれたライブラリがないか確認し、そのソースコードを見て勉強してください。全ての有効なOAuth ライブラリではパーセントエンコーディングを実装しているはずです。
RFC3986 compliant encoding functionsThe following table links to implementations of RFC3986 for a variety of languages.
If your language of choice is not listed here, check this page of OAuth libraries to see whether there exists a library written in your language, and inspect their source code. All valid OAuth libraries will implement percent encoding. |
以下の例は、あなたのコードで出力された文字列との比較に使えるかもしれません。 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 |
ExamplesThe following examples may be helpful to compare with the output of your own code. You should consider any differences an error. Spaces encoded as “+” characters are an example of incorrect encoding.
|