跳转到主要内容

百分号编码参数

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