澄清先前發佈的註解
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'];
?>