php读取JS写入的COOKIE,怎么读取?

kelming 2011-03-30 10:08:36
JS读取PHP的没问题
JS读取JS的也没问题
PHP读取PHP也没问题
就PHP读取JS的有问题。
详细代码如下

<!DOCTYPE script PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>
<body>
<?php
header("content-type:text/html; charset=utf-8");
//在PHP中设置COOKIE
setcookie("phpCookie","我是PHP产生的Cookie", time()+3600);
?>
<script language="javascript">  
//JavaScript中设定Cookie值   
function setCookie(name,value)
{
var Days = 1/1440; //此 cookie 将被保存 30 天
var exp = new Date(); //new Date("December 31, 9998");
exp.setTime(exp.getTime() + Days*24*60*60*1000);
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();


}
//JS取JS保存的cookie
function getCookie2(name)
{ var temp = name + "=";
var tempLen = temp.length;
var cookieLen = document.cookie.length;
var i = 0;
while (i < cookieLen) {
var j = i + tempLen;
if (document.cookie.substring(i, j) == temp) {
return getCookieVal(j);
}
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}
//辅助
function getCookieVal (offset) {
var endstr = document.cookie.indexOf (";", offset);
if (endstr == -1) {
endstr = document.cookie.length;
}
return unescape(document.cookie.substring(offset, endstr));
}


//js取PHP保存的Cookie值
function getCookie(sName)
{
var aCookie = document.cookie.split("; ");
for (var i=0; i < aCookie.length; i++){
var aCrumb = aCookie[i].split("=");

if (encodeURIComponent(sName) == aCrumb[0])
return decodeURIComponent(aCrumb[1]);
}
return null;
}

</script>
<script>
//显示经过解码的PHP设置的COOKIE
alert(getCookie("phpCookie"));
//使用JavaScript设置COOKIE值
setCookie("jsCookie","我是JavaScript产生的Cookie");
alert(getCookie2("jsCookie"));
</script>
<?php

//显示JavaScript设置的COOKIE的
if (isset($_COOKIE["jsCookie"]))
echo urldecode($_COOKIE["jsCookie"]);
echo "<br />";
echo $_COOKIE["phpCookie"];
?>
</body></html>


第一次运行跳错。第二次因为写如cookie了没事
最后PHP读取JS产生的COOKIE
结果如下
%u6211%u662FJavaScript%u4EA7%u751F%u7684Cookie
我是PHP产生的Cookie

编码都采用UTF-8这些没什么问题。
...全文
734 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaopeiling22 2011-05-16
  • 打赏
  • 举报
回复
受教了
kelming 2011-03-31
  • 打赏
  • 举报
回复
感谢life169。刚自己改的时候没看到。我刚接触PHP,对函数不是很了解。你的方法比我简单多了。效率也高多了。
kelming 2011-03-31
  • 打赏
  • 举报
回复
结贴了。下面这个是我改的。中英转回来的。
function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/(%u.{4})/",$str,$r);
$ar = $r[0];
$table_change = array();
foreach($ar as $k=>$v) {
if(substr($v,0,2) == "%u" && strlen($v) == 6)
{
$ar[$k] = iconv("UCS-2","utf-8",pack("H4",substr($v,-4)));

$table_change = array($v=>$ar[$k]);

}
$str =strtr($str,$table_change);
}
//echo $str;
return $str;
}
life169 2011-03-31
  • 打赏
  • 举报
回复
如果是utf-8编码 则用这个:

$ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));
life169 2011-03-31
  • 打赏
  • 举报
回复
把徐老大的函数略做修改就可以了
(适用于gbk/gb2312编码的)

function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/(%u.{4})/",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(substr($v,0,2) == "%u" && strlen($v) == 6)
$ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,-4)));
}
return str_replace($r[0],$ar,$str);
}
$str = '%u6211%u662FJavaScript%u4EA7%u751F%u7684Cookie';
echo unescape($str);

输出:

我是JavaScript产生的Cookie
lazyboy_wu 2011-03-31
  • 打赏
  • 举报
回复
换下其他编码测试下,你的编码采用的是什么编码?那个是针对gb2312的
kelming 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hnxxwyq 的回复:]
js的escape() 与 php的urldecode() 不是一组互逆的函数

给你一个xuzuning大大的php实现



另外js写的cookie只有下次请求php时,才会带上该cookie信息,因为服务端先执行,js客户端后执行

带着上次设置的cookie请求php -> php 获取cookie -> php返回内容(设置cookie) -> js执行 -> js 设……
[/Quote]

确实可以对这些编码可以转换,但只转了第一个。
我是JavaScript%u4EA7%u751F%u7684Cookie
中间的几个字没有转换。。
lazyboy_wu 2011-03-30
  • 打赏
  • 举报
回复
js的escape() 与 php的urldecode() 不是一组互逆的函数

给你一个xuzuning大大的php实现



另外js写的cookie只有下次请求php时,才会带上该cookie信息,因为服务端先执行,js客户端后执行

带着上次设置的cookie请求php -> php 获取cookie -> php返回内容(设置cookie) -> js执行 -> js 设置cookie -> 重复开头

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧