首页 > 解决方案 > javascript encodeURIComponent 和转义?

问题描述

我使用 JS 将 encodeURIComponent 字符串发送到 PHP 文件写入,并且多年来一直运行良好;直到最近我遇到了一个奇怪的效果,即文本需要用转义进一步编码才能让它工作!只有当我使用开源的所见即所得编辑器时,症状才会开始显示!

URI 中需要转义来修复它的违规字符可能是什么?我以前认为 URI 只保留?& = 使其语法正常工作。

标签: javascriptescapingencodeuricomponent

解决方案


您描述的情况可能可以通过涉及两个级别的嵌套 URL-like 值的 URL 来解释 - 尽管如果不告诉我们字符串是什么以及它是如何使用的,就无法知道。

考虑一个带有查询参数的 URL,该参数是另一个 URL:

http://me.com?url=http://you.com?qp=1

该 URL 容易被误解,因此我们通常会对 URL 进行 URL 编码you.com,从而为我们提供:

http://me.com?url=http%3A%2F%2Fyou.com%3Fqp%3D1

使用此 URL 的任何人现在都可以提取以urlvalue命名的查询参数http%3A%2F%2Fyou.com%3Fqp%3D1,对其进行解码(通常框架或库会为您解码),然后使用它跳转到或调用该 URL。

然而,考虑一下you.comURL 本身有一个查询参数的情况,不是?qp=1像第一个示例中给出的那样,而是本身需要进行 URL 编码的东西。为了简单起见,我们只使用“cat?pictures”。我们需要对其进行编码,使查询参数

换句话说,有问题的 URL 将是

?qp=cat%3Fpictures

如果我们按原样使用它,那么我们的整个 URL 将变为

http://me.com?url=http%3A%2F%2Fyou.com%3Fqp=cat%3Fpictures

不幸的是,如果我们现在以一种幼稚的方式对其进行解码,我们会得到

http://me.com?url=http://you.com?qp=cat?pictures

换句话说,嵌套的 URL 也被解码了,这意味着它会认为 URL 有两个查询参数,即url qp。为了成功处理这个问题,我们需要对第二个查询参数进行第二次编码,产生

http://me.com?url=http%3A%2F%2Fyou.com%3Fqp%3Dcat%253Fpictures

但是请注意,如果您使用您的语言或环境的内置工具和库来处理查询参数,大部分情况将自动发生,您不必担心。

仅当我使用开源所见即所得编辑器时才开始显示症状

编辑器只是将字符放在文件中。很难想象编辑器会导致您提到的问题,除非可能某个编辑器被配置为使用智能引号,例如,这几乎会破坏涉及引号的所有内容。


推荐阅读