2017-09-15 56 views
2

我正在开发使用CodeIgniter(PHP 7.1.1)网站,在客户端,我需要一些日期发送到服务器:微软边缘AJAX怪异POST数据enconding

var date_str = date.toLocaleDateString(); 
var time_str = date.toLocaleTimeString().split(':'); 
time_str = time_str[0] + ':' + time_str[1]; 
... 
data_to_ajax = { 
    date: inicio, 
    date2: termino 
}; 
... 

服务器将使用验证这些日期:

DateTime::createFromFormat('d/m/Y H:i', $date); 
DateTime::createFromFormat('d/m/Y H:i', $date2); 

它工作正常,使用Microsoft边缘时除外,createFromFormat将始终发送的日期返回false。为了调试我叫var_dump上的日期发送,我得到的是:

string(43) "29/08/2017 21:00" 
string(31) "29/08/2017 23:30" 

而在浏览器和Mozilla什么我得到的是:

string(16) "29/08/2017 21:00" 
string(16) "29/08/2017 23:30" 

好,调试HTTP主体数据发送,铬和Mozilla浏览器将发送63个字节:

date_loc=29%2F08%2F2017+21%3A00&date_ter=29%2F08%2F2017+23%3A30 

而边缘189发送(63 * 3)字节:

date_loc=%E2%80%8E28%E2%80%8E%2F%E2%80%8E08%E2%80%8E%2F%E2%80%8E2017+%E2%80%8E21%E2%80%8E%3A%E2%80%8E00%E2%80%8E&date_ter=%E2%80%8E28%E2%80%8E%2F%E2%80%8E08%E2%80%8E%2F%E2%80%8E2017+23%3A30 

两个似乎是正确的,因为这:url encoder/decoder可以将其解码,这些问题似乎是与服务器,为什么PHP的显示,两个字符串具有相同的字符数有不同的长度?更奇怪的是var_dump可以正常显示这些字符串,但createDateFromFormat将会失败。

+1

结合'%E2%80%8E'其边缘似乎被追加到处都是[从左到右的标记](https://en.wikipedia.org/wiki/Left-to-right_mark)不知道为什么边缘添加尽管如此。在这种情况下使用看起来毫无意义 – apokryfos

+0

是您使用从右到左语言的默认语言吗? – apokryfos

+0

不,我用左到右 –

回答

1

微软边缘被放置在发送的数据%E2%80%8E,至极是Left-to-right mark,这是造成与PHP函数问题:createDateFromFormat,因为边缘发出的字符串不符合规定的格式为:d/m/Y H:i,你还能怎样使用*d*/*m*/*Y *H*:*i*或者你可以删除所有控制字符(Remove control characters from php String):做的是使用*doc)字符格式字符串

$date = preg_replace('/[^\PC\s]/u', '', $date);