PHP 手册对 setcookie 的使用范例里提到:
注意:在发送 Cookie 时,值的部分会被自动 urlencode 编码。收到 Cookie 时,会自动解码,并赋值到可变的 Cookie 名称上。 如果不想被编码,可以使用 setrawcookie() 代替――如果你的 PHP 版本是 5 及以上。
里面的措辞:“值的部分会被自动 urlencode 编码”令人佩服。
加号“+”不在发送时“值的部分”不被自动编码,但是在收到时,却被自动 urldecode 了:一来一回,加号“+”变成了空格。
太坑了,还是手动 rawurlencode 和 rawurldecode 比较靠谱。