跳转到主要内容

百分号编码参数

X API 的部分功能,尤其是涉及 OAuth 签名的部分,要求按照 RFC 3986 第 2.1 节 对字符串进行编码。由于许多 URL 编码算法的实现与 RFC 3986 并不完全兼容,错误的编码是导致 OAuth 签名错误的常见原因。为此,本页说明应使用的准确签名算法。 本页介绍了 RFC 3986 第 2.1 节 中描述的 URL 编码过程。若与本文档存在歧义或冲突,建议以该规范为准。  

对字符串进行编码

以下算法假设你通过将字符串 SRC 的值逐字节复制到字符串 DST 来对其进行编码。 步骤 1:当 SRC 仍包含未读取的字节时,从 SRC 读取下一个字节(8 位)。 通常这被视为一个字符,但对于某些一个字符可能由多个字节表示的编码(如 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:向 DST 写入两个字符,代表当前字节按大写 ASCII 编码表示的十六进制值。 这可能有点抽象,举例如下。假设当前字节是 0xE6(对应二进制 11100110)。这与字符 ‘æ’ 的 UTF-8 编码值一致。要对该值进行编码,先向 DST 写入字符 ‘E’(0x45,见上表),再写入字符 ‘6’(0x36)。最后写入的三个字符应为 “%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
I