对参数进行百分号编码

部分 Twitter API(特别是处理 OAuth 签名的 API)要求根据 RFC 3986 第 2.1 节的规定对字符串进行编码。由于 URL 编码算法的许多实现与 RFC 3986 不完全兼容,因此错误编码仍是许多 OAuth 签名错误的原因。为此,本页中介绍了要使用的确切签名算法。

本页面介绍了 RFC 3986 第 2.1 节中描述的 URL 编码过程。如果有内容存在歧义或与本文档内容矛盾,请参考此规范。
 

对字符串进行编码

以下算法假设你通过将字符串 SRC 的值逐字节复制到字符串 DST 来对字符串 SRC 进行编码。

步骤 1:如果 SRC 包含未读字节,请从 SRC 读取下一个字节(8 位)。 这通常被视为是一个字符,但在字符可能超过 1 个字节的编码中(例如 UTF-8),只需读取第一个字节即可。

步骤 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。 百分号字符“%”(十六进制为 0x25,二进制为 00100101)表示接下来的两个字节将代表一个编码字节。

步骤 4:将表示当前字节的大写 ASCII 编码十六进制值的两个字符写入 DST。 这有点让人困惑,因此下面提供了一个示例。假设当前字节为 0xE6(二进制为 11100110)。它对应于 UTF-8 编码值“æ”。要对此值进行编码,请在 DST 中写入字符“E”(上表中的 0x45),然后写入字符“6”(0x36)。最后写入的三个字符应为“%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

 

后续步骤