19

因此,根据我对 PHP 和 cookie 的理解,如果我使用该setcookie()函数,那么我会得到一个自动 url 编码的 cookie。当我进入$_COOKIE数组时,我应该取回 cookie,自动对 url 进行解码。问题是,当我查看$_COOKIE.

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

乔|123|my+email@somewhere.com

这将被编码为:

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

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

乔|123|我的电子邮件@somewhere.com

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

另一个有趣的转折。页面上的刷新似乎会产生正确的输出。任何想法为什么它会这样?

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

想法将不胜感激。

4

3 回答 3

6

值得注意的是,“%20”和“+”都是空格字符的有效编码。根据关于URL 编码的 Wikipedia 文章(已添加重点):

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

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

何时将空格编码为加号 (+) 或 %20?

于 2013-01-17T16:55:25.903 回答
2

如果不想自动对 cookie 进行编码,可以使用setrawcookie函数。
此函数的例外是,您不能使用这些字符: (,; \t\r\n\013\014) :

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

# Output in browser:   
Joe|123|my+email@somewhere.com 

# Output in PHP `echo $_COOKIE['NAME']`:  
Joe|123|my email@somewhere.com

使用 PHP 5.3 测试

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

# Output in browser:  
Joe%7C123%7Cmy%2Bemail%40somewhere.com  

# Output in PHP echo $_COOKIE['NAME']`:  
Joe|123|my+email@somewhere.com  

now :作为另一种方法,您可以使用setcookie(), 和rawurldecode()对其进行解码:

 echo rawurldecode($_COOKIE['NAME'])
于 2013-01-17T17:09:38.473 回答
2

首先,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>
于 2013-01-17T17:15:48.340 回答