ByteCompress

URL编码器

对URL或单个URI组件中的特殊字符进行百分比编码,以便在HTTP请求、查询字符串和表单数据中安全传输。遵循RFC 3986。

0 chars
FreeClient-sideNo signup

URL查询字符串中的空格字符会静默破坏请求。RFC 3986(统一资源标识符:通用语法)定义了哪些字符在URL中是安全的,哪些必须进行百分比编码。百分比编码用%后跟两个大写十六进制数字替换每个不安全的字节。这个基于浏览器的编码器立即应用RFC 3986,而不会将您的数据传输到任何地方。使用它来编码完整的URL或单个查询参数值,并每次获得符合标准的输出。

如何编码URL

  1. 将URL或文本粘贴到输入框中。
  2. 选择完整URL模式以仅编码不安全字符,或选择组件模式以编码所有特殊字符,包括&=
  3. 百分比编码的输出将显示在结果面板中。
  4. 复制编码后的字符串以用于您的请求、代码或文档。

理解百分比编码

RFC 3986标准

RFC 3986(IETF,2005)定义了URI中的两类字符。未保留字符A-Z a-z 0-9 - _ . ~)可以不编码地出现。保留字符: / ? # [ ] @ ! $ & ' ( ) * + , ; =)具有特殊的结构意义,可能需要编码,也可能不需要,具体取决于上下文。其他所有字符--包括空格、非ASCII Unicode和不在这些集合中的字符--必须进行百分比编码。

encodeURI与encodeURIComponent

JavaScript提供了两个编码函数。encodeURI()编码完整的URL,并保持保留字符不变,因为它们起到结构作用。encodeURIComponent()也编码结构字符,将其视为文字数据--它是为单个查询参数名称和值设计的,其中&=会破坏URL语法。该工具的完整URL模式对应于encodeURI;组件模式对应于encodeURIComponent

示例

输入

Hello World! @2024

输出(组件模式)

Hello%20World!%20%402024

空格编码为%20(RFC 3986标准);@变为%40。感叹号在某些上下文中是未保留字符,可能需要编码,也可能不需要,具体取决于模式。

常见用例

  • 查询参数值 - 在附加到URL之前编码包含&=+的值
  • 搜索引擎查询 - 在构建重定向URL之前编码用户搜索输入
  • API请求构建 - 编码包含斜杠、空格或特殊字符的路径段
  • OAuth参数 - OAuth 1.0签名基础字符串需要根据RFC 5849进行百分比编码

常见错误

  • 双重编码 - 如果一个值已经被百分比编码,再次编码会编码%本身,产生%2520而不是%20
  • 对参数值使用完整URL模式 - 完整URL模式保留&=未编码,破坏查询字符串语法;对参数值使用组件模式
  • 忘记非ASCII字符 - 非ASCII文本必须先转换为UTF-8字节,然后每个字节单独进行百分比编码

要逆转该过程,请使用URL解码器。对于在URL查询参数中传输的二进制数据,首先在URL安全模式下使用Base64编码器进行编码,然后输出已经是URL安全的,无需额外的百分比编码。

常见问题

URL编码和Base64编码有什么区别?

百分比编码用%XX十六进制序列替换不安全字符,同时保持安全字符不变,因此输出长度与输入相似。Base64将所有数据转换为64个字符的字母表,增加33%的大小,但确保结果仅包含安全的ASCII字符。百分比编码使特定字符在URL中安全;Base64将任意二进制数据编码为文本。

在JavaScript中,我应该何时使用encodeURI与encodeURIComponent?
encodeURI()用于编码完整的URL - 它保留结构字符,如: / ? # & =encodeURIComponent()用于编码URL中的单个值 - 它编码结构字符,使其被视为文字数据而不是URL语法。如果不确定,请对任何用户提供的输入使用encodeURIComponent()
为什么在某些编码器中空格变成%20而在其他编码器中变成+?
%20是RFC 3986中表示空格的百分比编码,适用于URI路径段和查询值。+符号表示空格,特定于application/x-www-form-urlencoded(HTML表单提交),早于RFC 3986。两者在各自的上下文中都是有效的,但%20是HTML表单外的通用标准。
URL编码适用于非ASCII字符吗?

是的。非ASCII字符首先转换为UTF-8字节,然后每个字节单独进行百分比编码。字符ş(U+015F)变为%C5%9F。汉字中(U+4E2D)变为%E4%B8%AD。现代浏览器和服务器都期望在URL中使用UTF-8编码的非ASCII字符。

使用此工具时,我的URL数据会发送到您的服务器吗?

不。所有编码都使用encodeURI()或encodeURIComponent()在您的浏览器中本地运行。您粘贴的URL、查询参数、身份验证令牌和任何其他数据不会被传输到我们的服务器。