为什么PHP用$ _COOKIE中的空格替换加号?

时间:2013-01-17 16:33:44

标签: php cookies setcookie

因此,根据我对PHP和cookie的理解,如果我使用setcookie()函数,那么我会得到一个自动进行url编码的cookie。当我转到$_COOKIE数组时,我应该恢复cookie,自动解码url。问题是,当我查看$_COOKIE时,它似乎正在解码cookie两次。

假设我有一个cookie,其值为“Name | ID | Email”,例如:

  

Joe|123|my+email@somewhere.com

这将被编码为:

  

乔%7C123%7Cmy%2Bemail%40somewhere.com

注意加号是编码的,所以理论上如果我解码它我应该把它取回来。由于这是在$_COOKIE中自动完成的,我应该回到我的开始。但相反,我回来了:

  

Joe | 123 | my email@somewhere.com

注意以前的加号空间。如果我在cookie上运行了额外的urldecode(),这就是我所期望的。但我不是,所以我不知道为什么我会得到一个空间而不是一个加号。

另一个有趣的转折。页面上的刷新似乎产生了正确的输出。有什么想法,为什么它表现得像这样?

仅供参考,要设置初始cookie,我使用javascript和escape()脚本来生成编码字符串。这可能是javascript和PHP之间的问题吗?

我们将不胜感激。

3 个答案:

答案 0 :(得分:6)

值得注意的是,“%20”和“+”都是空格字符的有效编码。根据维基百科关于URL encoding的文章(强调补充):

  

提交已输入HTML表单的数据时,表单   字段名称和值被编码并以HTTP格式发送到服务器   使用方法GET或POST请求消息,或者历史上通过电子邮件请求消息。   默认情况下使用的编码基于非常早期的版本   一般URI百分比编码规则,有许多修改   例如换行标准化和用“+”替换空格而不是   “%20”即可。以这种方式编码的MIME类型是   application / x-www-form-urlencoded,目前已定义(仍然是   以非常过时的方式)在HTML和XForms规范中。

更具体地涉及PHP和JavaScript,请参阅此问题的最佳答案:

When to encode space to plus (+) or %20?

答案 1 :(得分:1)

如果你不想自动编码你的cookie,你可以使用与{setmokie()相同的setrawcookie()函数
但是使用此函数你不能在值内使用这些字符:(,; \ t \ r \ n \ n \ \ n \ \ n \ 013 \ 014):

setrawcookie("NAME","Joe|123|my+email@somewhere.com");  

资源输出 - chrome中的cookie:

Joe|123|my+email@somewhere.com 

当你回复$ _COOKIE ['NAME']

Joe|123|my email@somewhere.com

但是:我在php 5.3.13中测试它的内容

setcookie("NAME","Joe|123|my+email@somewhere.com");

资源输出 - chrome中的cookie:

Joe%7C123%7Cmy%2Bemail%40somewhere.com  

当我回复$ _COOKIE ['NAME']时:

Joe|123|my+email@somewhere.com  

现在:如果您仍然有问题,可以使用setcookie()功能,然后使用rawurldecode()对其进行解码:

 echo rawurldecode($_COOKIE['NAME'])

答案 2 :(得分:1)

首先,PHP将始终在JavaScript之前运行 - 它是服务器端而不是客户端,因此在您刷新页面之前,您使用JavaScript设置的cookie实际上不可用于PHP(因此该问题)。

下一个JavaScript有不同的方法来编码字符串;只有一个会自动使用PHP。

所以:

document.cookie = "testuser=" + "Joe|123|my+email@somewhere.com";
// Joe|123|my email@somewhere.com (when decoded by PHP)

document.cookie = "testuser=" + escape("Joe|123|my+email@somewhere.com");
// Joe|123|my email@somewhere.com (when decoded by PHP)

document.cookie = "testuser=" + encodeURI("Joe|123|my+email@somewhere.com");
// Joe|123|my email@somewhere.com (when decoded by PHP)

document.cookie = "testuser=" + encodeURIComponent("Joe|123|my+email@somewhere.com");
// Joe|123|my+email@somewhere.com 

所以,为了测试,请尝试这个(记住你需要刷新页面才能看到cookie值):

<html>
<head>
    <title>Cookie Juggling</title>
    <script type="text/javascript">
        document.cookie = "testuser=" + encodeURIComponent("Joe|123|my+email@somewhere.com");
    </script>
</head>

<body>
    <div><?php echo !empty($_COOKIE['testuser']) ? $_COOKIE['testuser'] : "Cookie not set yet"; ?></div>
</body>
</html>