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 returns 是什么(有效):
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 returns(破解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 returns,但它给我带来了很多问题!那么是否有 encodeURI() 的替代方案?即使我不对 url,如果我将 FF 编码 url 复制到它,IE 就可以工作!
更新:
示例代码 link
我觉得跟toLocaleString()有关系
最终更新:
很少有人回答,link "appears only in 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
当您想对 URL 参数进行编码时使用 encodeURIComponent。
这里有一些有用的链接
When are you supposed to use escape instead of encodeURI / encodeURIComponent?
https://coderwall.com/p/y347ug/encodeuri-vs-encodeuricomponent
问题不在于 encodeURI
(尽管正如其他人所指出的,您永远不应使用 encodeURI
,而应使用 encodeURIComponent
对各个组件进行编码,然后将它们连接在一起)。
问题是日期由于某种原因包含很多 U+200E "LEFT-TO-RIGHT MARK"
个字符(不可见,但仍然存在),一旦编码就变成 %E2%80%8E
.
向我们展示 where/how 您获得了时间,或者过滤时间字符串以在编码之前删除那些字符。
定义一个简单的 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);
我使用 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 returns 是什么(有效):
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 returns(破解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 returns,但它给我带来了很多问题!那么是否有 encodeURI() 的替代方案?即使我不对 url,如果我将 FF 编码 url 复制到它,IE 就可以工作!
更新: 示例代码 link
我觉得跟toLocaleString()有关系
最终更新:
很少有人回答,link "appears only in 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
当您想对 URL 参数进行编码时使用 encodeURIComponent。
这里有一些有用的链接
When are you supposed to use escape instead of encodeURI / encodeURIComponent?
https://coderwall.com/p/y347ug/encodeuri-vs-encodeuricomponent
问题不在于 encodeURI
(尽管正如其他人所指出的,您永远不应使用 encodeURI
,而应使用 encodeURIComponent
对各个组件进行编码,然后将它们连接在一起)。
问题是日期由于某种原因包含很多 U+200E "LEFT-TO-RIGHT MARK"
个字符(不可见,但仍然存在),一旦编码就变成 %E2%80%8E
.
向我们展示 where/how 您获得了时间,或者过滤时间字符串以在编码之前删除那些字符。
定义一个简单的 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);