setcookie()的php中其中一点提醒
cookie 中值的部分在发送的时候会被自动用 urlencode编码并在接收到的时候被自动解码并把值赋给与自己同名的 cookie 变量。如果不想这样并且在使用 PHP 5 的话,可以用 来代替。
在发送时编码
浏览器向php发送再用url来解码
php设置的header
Set-Cookie UID_USER_PWd=32%5Eqidizi%E6%B5%8B%2B%5E982312270e1f07623afd3374a2e4d46c3053e586b0eda760fb0e461c2f657aaf8de9eb5725459af7; expires=Tue, 26-Feb-2013 16:00:00 GMT; path=/; domain=.chinahrd.net
从document.cookie得到的值 没变
UID_USER_PWd=32%5Eqidizi%E6%B5%8B%2B%5E982312270e1f07623afd3374a2e4d46c3053e586b0eda760fb0e461c2f657aaf8de9eb5725459af7
其实中文部分是 qidizi测+
所以得到js中得到cookie的值时应该使用decodeURIComponent来解码,而不是escape,这是php的中文处理,其它后台语言就不清楚了.
escape是乱码>>> unescape( 'qidizi%E4%B8%AD')"qidizi???">>> decodeURIComponent( 'qidizi%E4%B8%AD')
"qidizi中"
到此setcookie配合decodeuricomponent可以正常处理中文
如果使用了setrawcookie自己urlencode即可,接收时肯定是自动使用decode了
js对encodeURIComponent说明
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
php对urlencode说明
除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
虽然有点区别,但是发现它们没有影响互相的编解