URL编码器
对URL或单个URI组件中的特殊字符进行百分比编码,以便在HTTP请求、查询字符串和表单数据中安全传输。遵循RFC 3986。
URL查询字符串中的空格字符会静默破坏请求。RFC 3986(统一资源标识符:通用语法)定义了哪些字符在URL中是安全的,哪些必须进行百分比编码。百分比编码用%后跟两个大写十六进制数字替换每个不安全的字节。这个基于浏览器的编码器立即应用RFC 3986,而不会将您的数据传输到任何地方。使用它来编码完整的URL或单个查询参数值,并每次获得符合标准的输出。
如何编码URL
- 将URL或文本粘贴到输入框中。
- 选择完整URL模式以仅编码不安全字符,或选择组件模式以编码所有特殊字符,包括
&和=。 - 百分比编码的输出将显示在结果面板中。
- 复制编码后的字符串以用于您的请求、代码或文档。
理解百分比编码
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、查询参数、身份验证令牌和任何其他数据不会被传输到我们的服务器。