Base64 和 URL 编码有什么区别
Base64 用来把字节表示成文本,URL 编码用来让 URL 组件里的文本安全通过,两者不能互相替代。
Base64 和 URL 编码都是编码机制,但不能互相替代。Base64 把字节表示成文本,URL 编码让文本在 URL 的特定位置里安全存在。
用错以后,值看起来也许像是“编码过”,但放到目标位置就会坏。
Base64 表示字节
Base64 把二进制数据变成一套文本字母表。它适用于系统要求文本、但你需要携带字节的场景。
常见例子:
- 在 JSON 里嵌入小段二进制值。
- 检查使用 Base64URL 的 Token 片段。
- 通过只接受文本的通道传递字节。
- 为小资源创建 data URL。
当问题是“这个 Base64 值代表什么字节或文本”时,用 Base64 编码 / 解码。
URL 编码保护 URL 边界
URL 编码,也叫百分号编码,用来转义 URL 中有特殊含义的字符。例如 query 参数值里可能需要保留 ?、&、=、/ 或空格。
常见例子:
- 编码搜索关键词。
- 传递内嵌 redirect URL。
- 构造 OAuth callback 参数。
- 解码复制出来的 query string。
当问题是“这段文本放进 URL 组件后还能不能保持原意”时,用 URL 编码 / 解码工具。
Base64URL 是特殊情况
Base64URL 调整了 Base64 字母表,让它更适合出现在 URL 里,通常会替换 + 和 /,有时省略 padding。JWT 就使用这种形式。
但 Base64URL 仍然是在把字节表示成文本。它不能替代任意 URL 参数的百分号编码。
怎么选择
先看值要去哪里:
- 二进制数据进入文本:Base64。
- 文本进入 query 参数:URL encode。
- 一个 URL 放进另一个 URL:编码内层 URL。
- 检查 JWT header 或 payload:Base64URL decode。
- 表单值:使用接收方期待的 form encoding 规则。
调试线索
如果看到 %2F、%3D、%26,通常是 URL 编码。如果看到由字母、数字、+、/、_、- 组成的长文本,可能是 Base64 或 Base64URL。
先把编码类型叫对,修 bug 会快很多。