【问题标题】:Javascript - encodeURI() returing different results in different browsersJavascript - encodeURI() 在不同的浏览器中返回不同的结果
【发布时间】:2016-03-18 21:47:33
【问题描述】:

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

实际的网址是: 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 似乎也可以工作,如果我复制 IE 可以工作FF 编码的 url!


更新: 示例代码link

我认为它与 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() changes in IE11

【问题讨论】:

  • 对特殊字符尝试 encodeURIComponent()
  • 请出示您的实际代码。
  • @SyntaxLAMP 不是,它会弄乱整个 url 并且在任何地方都不起作用@MaxZuber 这是代码var phphref = 'http://localhost/get.php?id=e_'+event.title+'&amp;title='+event.title+'&amp;desc='+event.description+'&amp;stime='+stime+'&amp;etime='+etime; console.log('url only:'); console.log(phphref); //fine function myFunction(uri) { var res = encodeURI(uri); //console.log(res); return res; } var calfile = myFunction(phphref); console.log('encoded:'); console.log(calfile); //fine in ff, not in ie ! 谢谢

标签: javascript php internet-explorer urlencode microsoft-edge


【解决方案1】:

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

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

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

【讨论】:

  • 我想我找到了导致这一切的问题! (也许),查看两个浏览器中生成的 url 的结果,我发现 IE 中缺少 (,),结果是由于 toLocaleString(),因为在 IE 中它返回不同的值,如果你不是在我们中。现在根据link 我使用toLocaleString('en-US'); 但它还没有任何不同;\
  • 我的代码太大了 :\ 但是我创建了这个例子,如果你在 IE/FF link987654322@ 中测试它会有同样的问题
  • @et3rnal,我不确定我是否理解您为什么要使用toLocaleString 作为您要发送到服务器的日期,该日期需要被它解析。 toLocaleString 用于将日期转换为直接呈现给用户的字符串。对于内部使用,我建议您使用绝对时间戳值(自纪元以来的毫秒数)或 toISOString,它将提供您可以信赖的标准格式的日期。
  • 我用尽了方法后重新阅读了您的答案,最后我过滤了有线LTR标记以及逗号!因为我不知道为什么 IE 忽略它。现在工作正常,这是简单的过滤功能(我在另一个问题中找到并修改它)function FixLocaleDateString(localeDate) { var newStr = ""; for (var i = 0; i &lt; localeDate.length; i++) { var code = localeDate.charCodeAt(i); if (code != 44 &amp;&amp; code != 8206 ) { newStr += localeDate.charAt(i); } } return newStr; }
  • 感谢您提供的信息,我以后可能会更改它。我使用它的原因是它是我正在使用的插件的一部分。
【解决方案2】:

定义一个简单的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);

【讨论】:

    【解决方案3】:

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

    这里有一些有用的链接

    When are you supposed to use escape instead of encodeURI / encodeURIComponent?

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

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 2018-04-27
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多