在JavaScript中,当方括号和圆括号位于查询字符串中时,URL构造函数不会对它们进行编码,而AS encodeURIencodeURIComponent总是对它们进行编码.这让我很困惑,因为大多数消息来源说,当查询参数包含特殊字符时,要使用encodeURI/encodeURIComponent进行编码.我预计URL号物体也会有类似的行为.

这导致我在编写单元测试时遇到问题,因为我不知道来自URL对象的查询参数将如何编码.这有规范吗?或者我应该总是在使用URL构造函数之前只编码我的参数吗?谢谢你的帮助.


显示URL对象未对查询字符串中的方括号进行编码的示例

const href = (new URL('https://foobar.com?myQuery={"@asdf/asdf":"1234"}')).href;
//     ^ https://foobar.com/?myQuery={%22@asdf/asdf%22:%221234%22}

如果我使用encodeURI,唯一的区别是方括号是编码的

const href = encodeURI('https://foobar.com?myQuery={"@asdf/asdf":"1234"}');
//     ^ https://foobar.com?myQuery=%7B%22@asdf/asdf%22:%221234%22%7D

注意:如果方括号不在查询参数中,则URL对象does对它们进行编码.

const href = (new URL('https://foobar.com/}}}?myQuery={"@asdf/asdf":"1234"}')).href;
//     ^ https://foobar.com/%7D%7D%7D?myQuery={%22@asdf/asdf%22:%221234%22}

推荐答案

有多种可能的编码,所有的编码都应该被解释为相同的URL,所以在技术上没有一个是错误的.另一个例子是,百分比编码可以用大写或小写字符(%aa%AA)完成,并且域不区分大小写,空格可以(在某些部分)编码为+%20.

如果您想要对特定的URL编码器实现进行单元测试,您可以匹配字符串,但如果您想知道两个URL是否与其编码方式相同regardless%,则在进行比较之前,您首先需要经过名为"标准化"的步骤.

Javascript相关问答推荐

主要内部的ExtJS多个子应用程序

TypScript界面中的Infer React子props

使用axios.获取实时服务器时的404响应

被CSS优先级所迷惑

无法在nextjs应用程序中通过id从mongoDB删除'

在观察框架中搜索CSV数据

使用JQuery单击元素从新弹出窗口获取值

使用Promise.All并发解决时,每个promise 的线性时间增加?

可更改语言的搜索栏

编辑文本无响应.onClick(扩展脚本)

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

当标题被点击时,如何使内容出现在另一个div上?

JavaScript将字符串数字转换为整数

无法使用npm install安装react-dom、react和next

使用props 将VUE 3组件导入JS文件

如何阻止外部脚本进入顶层导航

相对于具有选定类的不同SVG组放置自定义工具提示

在AgGrid中显示分组行的单元格值

正在发出错误的URL请求

try 导入material 时出现错误NG0203