RevealTheme logo

URL编码与解码工具

将文本转换为URL安全的编码(百分号编码),或进行反向转换。适用于查询字符串、重定向和OAuth流程。

如何使用本工具

  1. 1

    Choose a mode with the Encode or Decode button at the top (Encode is selected by default).

  2. 2

    Type or paste your text into the input box — a raw value to encode, or a percent-encoded string to decode.

  3. 3

    Click Run to convert the text; the result appears in the monospace box below.

  4. 4

    Copy the output from the result box, or switch modes and click Run again to reverse the conversion.

什么是URL编码,何时需要它?

URL编码(也称为“百分号编码”,由RFC 3986规定)是将在URL中具有特殊含义的字符——或在URL中根本不安全的字符——转换为十六进制转义序列“%XX”的过程。URL规范保留了某些具有结构含义的字符:“?”开启查询字符串,“#”开启片段标识,“&”分隔查询参数,“/”分隔路径段,等等。如果用户输入包含其中任何字符,而你将其原样嵌入URL,解析器就会误解它。URL编码通过将每个保留字符或不安全字符替换为其前缀为“%”的十六进制字节表示,来避免这种情况。空格变为%20,“&”变为%26,“=”变为%3D。非ASCII字符(西里尔文、中文、表情符号)会被转换为多字节的UTF-8序列,其中每个字节都进行百分号编码。当你点击链接时,浏览器会自动处理这些;但每当你通过代码构建URL时——在创建搜索查询、重定向目标、OAuth回调或webhook签名时——都必须先对用户提供的值进行编码。本工具使用的正是你的JavaScript代码会使用的encodeURIComponent / decodeURIComponent函数,因此其行为与生产环境完全一致。

常见使用场景

  • 在将用户搜索词附加到搜索URL之前对其进行编码(?q=user+input)。

  • 安全地将OAuth的redirect_uri参数传递给授权服务器。

  • 构建在查询字符串中包含已编码JSON负载的webhook URL。

  • 对“returnTo”URL进行编码,使其在穿过其他URL时得以保留。

  • 解码提交表单后在地址栏中看到的已编码值。

  • 测试格式错误的URL是如何被解析的:对一个特殊字符进行编码,观察会发生什么。

常见问题

我何时应该对URL进行编码?
在将用户提供的值放入URL之前,务必对其进行编码:无论是查询参数、路径段还是片段标识。不进行编码是最常见的细微错误来源之一:值“猫 & 狗”会破坏查询字符串,直到它被编码为“猫%20%26%20狗”为止。
encodeURI和encodeURIComponent有什么区别?
encodeURI用于完整的URL:它会保留“/”、“?”、“&”、“=”等结构字符不变,因为它们在URL中具有含义。encodeURIComponent用于URL的各个部分(查询值、路径段):它会编码除字母数字之外的所有字符。请对单个查询值使用encodeURIComponent;切勿对用户提供的查询值使用encodeURI(它不会转义“&”,从而破坏你的查询字符串)。
什么是URL安全的Base64,它与URL编码有何不同?
它们是不同的概念。URL编码(即本工具)逐字符地替换特殊字符。URL安全的Base64是Base64的一种变体,它使用“-”和“_”代替“+”和“/”,因此其输出无需额外编码即已对URL安全。
为什么“+”有时会被解码为空格?
在application/x-www-form-urlencoded(表单提交)中,“+”是空格的简写。大多数解码器会保留这一点。在现代URI解析中,“%20”才是空格的正确编码。decodeURIComponent会将“+”视为字面意义的“+”;请使用decodeURI或表单解码器来将“+”转换为空格。
非ASCII字符是如何编码的?
它们首先被转换为UTF-8字节,然后每个字节再进行百分号编码。因此,“café”会变为“caf%C3%A9”:“é”是两个UTF-8字节(0xC3 0xA9)。本工具能正确处理UTF-8;某些老旧的工具使用Latin-1进行编码,会产生不同的输出。
URL编码和HTML实体编码是一回事吗?
不是。URL编码(%XX)为URL转义字符。HTML实体编码(&、<)为HTML标记转义字符。这两种上下文不同;在一种上下文中使用另一种的编码是常见的XSS错误。

相关工具