Javascript-encodeURI()在不同的浏览器中返回不同的结果


Javascript - encodeURI() returing different results in different browsers

我使用encodeURI()对php请求url进行编码,它在Firefox和Chrome中运行得很好,但在IE/Edge中则不然。

实际url为:http://localhost/get.php?id=e_e2&title=e2&desc=just a note&stime=6/12/2015, 1:00:00 AM&etime=15/12/2015, 1:00:00 PM

Firefox返回的是(有效):http://localhost/get.php?id=e_HO%20Event%201&title=HO%20Event%201&desc=This%20is%20just%20a%20test%20event%20of%20this%20handover%20only&stime=6/12/2015,%201:00:00%20AM&etime=10/12/2015,%201:00:00%20PM

IE返回的内容(中断php代码):http://localhost/get.php?id=e_HO%20Event%201&title=HO%20Event%201&desc=This%20is%20just%20a%20test%20event%20of%20this%20handover%20only&stime=%E2%80%8E6%E2%80%8E/%E2%80%8E12%E2%80%8E/%E2%80%8E2015%E2%80%8E%20%E2%80%8E1%E2%80%8E:%E2%80%8E00%E2%80%8E:%E2%80%8E00%E2%80%8E%20%E2%80%8EAM&etime=%E2%80%8E10%E2%80%8E/%E2%80%8E12%E2%80%8E/%E2%80%8E2015%E2%80%8E%20%E2%80%8E1%E2%80%8E:%E2%80%8E00%E2%80%8E:%E2%80%8E00%E2%80%8E%20%E2%80%8EPM

我试图解码IE返回的内容,但它给我带来了很多问题!,那么有没有encodeURI()的替代方案?,即使我不编码url,FF似乎也能工作,如果我将FF编码的url复制到IE,IE也能工作!


更新:示例代码链路

我认为这与toLocaleString()有关


最终更新:

正如很少有人回答的那样,链接中的一些磨损标记"只出现在IE中!"我不得不过滤并更改我的php脚本日期格式,以删除逗号

function FixLocaleDateString(localeDate) {
    var newStr = "";
    for (var i = 0; i < localeDate.length; i++) {
        var code = localeDate.charCodeAt(i);
            if (code != 44 && code != 8206 ) {
                newStr += localeDate.charAt(i);
            }
    }
        return newStr;
}

我在另一个答案中找到了这个函数,并对其进行了修改:ToLocaleDateString()在IE11 中的更改

问题不在于encodeURI(尽管正如其他人所指出的,您永远不应该使用encodeURI,而是使用encodeURIComponent对单个组件进行编码,然后将它们连接在一起)。

问题是,由于某种原因,日期包含许多U+200E "LEFT-TO-RIGHT MARK"字符(这些字符是不可见的,但仍然存在),这些字符一旦编码就变成了%E2%80%8E

向我们展示您在哪里/如何获得时间,或在编码前过滤时间字符串以删除这些字符。

定义一个简单的params对象来表示所需的URL参数并粘贴其项。如果属性中有一些不正确的字符,则需要在调用encodeURIComponent()之前将其过滤掉。

var params = {
  'id': 'e_'.concat(event.title.toString()),
  'title': event.title.toString(),
  'desc': event.description.toString(),
  'stime': stime.toString(),
  'etime': etime.toString()
};
var chunks = [];
for (var property in params) {
  if (params.hasOwnProperty(property)) {
    chunks.push(property.concat('=', encodeURIComponent(params[property])));
  }
}
var href = 'http://localhost/get.php?'.concat(chunks.join('&'));
console.log(href);

当您想要对URL参数进行编码时,请使用encodeURIComponent。

以下是一些有用的链接

什么时候应该使用escape而不是encodeURI/encodeURIComponent?

https://coderwall.com/p/y347ug/encodeuri-vs-encodeuricomponent