为了澄清之前发布的注释
cookie 名称中的点 (.) 和空格 ( ) 将被替换为下划线 (_)。
一般来说,$_COOKIE 中的值与 $_SERVER["HTTP_COOKIE"] 中的值并不相同!
在 phpinfo() 中,$_SERVER["HTTP_COOKIE"] 以 7 位显示浏览器存储在 cookie 中的实际值。
在 $_COOKIE 中,此值经过 7 位到 8 位的转换。
当 $_SERVER["HTTP_COOKIE"] 中的所有字符都在 ASCII = 7 位中时,$_COOKIE 会在 phpinfo() 中显示。当单个字符不在 ASCII 中时,phpinfo() 不会显示任何值!
虽然 $_COOKIE 仍然是 $_SERVER["HTTP_COOKIE"] 的 8 位转换!
原因:仅 8 位转换不足以说明字符的含义。
为此,需要使用的字符集。
phpinfo() 不知道字符集,因此最好什么也不说。
在 PHP 生成的网页中使用 $_COOKIE 时,环境具有使用字符集的信息,因此可以显示所需的字符。
三个说明性示例
===========================
使用 HTML 表单获取要存储在名为 "test" 的 cookie 中的内容。
"test" 字段中的输入字符串:door
$_SERVER["HTTP_COOKIE"]: test=door
$_COOKIE["test"]
在 phpinfo() 中显示:door
在任何 html 页面中显示:door
"test" 字段中的输入字符串(表单中使用 ISO-8859-1):Tür
$_SERVER["HTTP_COOKIE"]: test=T%FCr
$_COOKIE["test"]
在 phpinfo() 中显示:""
在 ISO-8859-1-html-页面中显示:Tür
(在 UTF-8-html-页面中显示:T�r)
"test" 字段中的输入字符串(表单中使用 UTF-8):Tür
$_SERVER["HTTP_COOKIE"]: test=T%C3%BCr
$_COOKIE["test"]
在 phpinfo() 中显示:""
在 UTF-8-html-页面中显示:Tür
(在 ISO-8859-1-html-页面中显示:Tür)
PHP 将点 (.) 替换为下划线 (_)。要查找所有原始 cookie 名称(和值),可以使用 $_SERVER['HTTP_COOKIE']。
例如,要检索使用 <?php setcookie('testing.dots', 'value'); ?> 设置的 cookie,可以使用
<?php
$cookies = explode('; ', $_SERVER['HTTP_COOKIE']);
$allCookies = [];
foreach($cookies as $cookie) {
$keyAndValue = explode('=', $cookie);
$allCookies[$keyAndValue[0]] = $keyAndValue[1];
}
var_dump($allCookies);
/*
array(1) {
["testing.dots"]=>
string(5) "value"
}
*/
echo $allCookies['testing.dots'];
?>