您可以使用encodeURI 或URL 对查询字符串进行编码。最近,我注意到 URL 对空格的编码不同。我将讨论为什么他们以不同的方式处理编码。在深入讨论该主题之前,我将向您展示如何使用每种方法进行编码。
您可以使用encodeURI 函数对URI 进行编码。然而,。它不会对属于 URI 有效部分的部分字符进行编码,因此您可能需要使用encodeURIComponent 函数来正确编码查询字符串或 URI 中的其他组件。
例如,假设您有一个值为
的查询字符串 q
https://www.google.com/search?q=& 是什么意思?.
&(& 符号)未按应有的方式转换为 &。因为 &(& 符号) 可以是 URI 的有效部分。因此,对查询字符串使用encodeURIComponent 总是更安全。
由于encodeURIX和相关函数将URI视为字符串,因此您必须处理特殊字符,例如?和你自己。或者,您可以使用 URL 来简化流程。
使用 URL 进行编码时,需要分别处理基本 URL 和查询字符串。
如果使用 URL 构造函数一次对所有内容进行编码,如上例所示,查询字符串可能无法正确编码。
通过 URL 对象的 searchParams 属性设置查询字符串,可以设置查询字符串。
在这种情况下,空格将转换为 .在解释为什么会发生这种情况之前,让我们用另一个查询字符串对其进行测试,看看它如何处理其他特殊字符。
其他特殊字符按预期编码。
现在,让我们深入探讨为什么会出现这些差异。
encodeURIX 函数根据 RFC2396 进行编码。 URI 不仅仅是互联网上的一个位置;它可以引用任何类型的资源。这就是为什么它被称为 URI(统一资源标识符)而不是 URL(统一资源定位符)。
URL API 根据 RFC3986 进行编码,这是更新的 URI 规范。
如果您需要使用encodeURI来实现此行为,请参阅此。 - RF3986 的encodeURIComponent 编码)。
URLSearchParams 遵循百分比编码规则进行编码。根据文档,它将空格替换为“”。
虽然我在 RFC 中找不到此行为的规范,但 MDN 的encodeURIComponent 文档指出:
对于 application/x-www-form-urlencoded,空格将被 替换,因此人们可能希望在encodeURIComponent() 替换之后再用 .
替换
这解释了为什么 URLSearchParams 中的空格被替换为“ ”,因为它遵循 application/x-www-form-urlencoded 标准。
您可能已经注意到,URL 和 URLSearchParams 遵循不同的 RFC。
让我们看一些例子。
如图所示,URL 不对括号和冒号进行编码,因为它们是 IPv6 地址的一部分。但是,冒号不会被编码为 :,即使它是查询字符串的一部分。它与百分比编码表不同。
这意味着您需要分别对 URL 和查询字符串进行编码。
现在,URL 和查询字符串已正确编码。
encodeURI、encodeURIComponent、URL 和 URLSearchParams 函数各自有不同的用途,您应该根据您的具体需求使用它们。
encodeURI:根据 RFC2396 对 URI 进行编码。它不会对属于 URI 有效部分的字符进行编码。如果您需要根据 RFC3986 对 URI 进行编码,请参阅此 MDN 文档。
encodeURIComponent:根据 RFC2396 对 URI 的组件进行编码,例如路径、片段或查询字符串。它包含未由encodeURI 编码的字符。
URL:根据 RFC3986 对 Web URL 进行编码。
URLSearchParams:根据 application/x-www-form-urlencoded 标准对参数进行编码。
如果需要将(加号)替换为 ,可以手动进行,如下所示:
在使用 Web 开发、Restful API 或 Web URL 时,URL 是可靠的选择。此外,它遵循 RFC3986,它比 RFC2396 更新。
希望您觉得这有帮助。
编码快乐!
以上是了解空格的编码方式:%withencodeURI 与 withURL的详细内容。更多信息请关注PHP中文网其他相关文章!