因此,根据我对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之间的问题吗?
我们将不胜感激。
答案 0 :(得分:6)
值得注意的是,“%20”和“+”都是空格字符的有效编码。根据维基百科关于URL encoding的文章(强调补充):
提交已输入HTML表单的数据时,表单 字段名称和值被编码并以HTTP格式发送到服务器 使用方法GET或POST请求消息,或者历史上通过电子邮件请求消息。 默认情况下使用的编码基于非常早期的版本 一般URI百分比编码规则,有许多修改 例如换行标准化和用“+”替换空格而不是 “%20”即可。以这种方式编码的MIME类型是 application / x-www-form-urlencoded,目前已定义(仍然是 以非常过时的方式)在HTML和XForms规范中。
更具体地涉及PHP和JavaScript,请参阅此问题的最佳答案:
答案 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>