PHP中iPhone读取含重音字符的$_COOKIE出现字符串截断问题
问题原因
RFC 6265 Cookie规范明确要求Cookie值只能包含US-ASCII编码的可打印字符,不支持直接存储Latin-1、UTF-8等编码的重音等非ASCII字符。安卓系统的浏览器内核对非标准Cookie做了容错兼容,而iOS的Safari/Webkit内核会严格遵循规范,遇到超出ASCII范围的字节时直接截断后续内容。
解决方案
遵循Cookie规范,在写入和读取环节对非ASCII内容做编解码处理即可:
- 存储Cookie时,先对值做
rawurlencode()编码后再写入
$cookieValue = "1 caffè al bar"; // 第三个参数可根据自己的需求调整过期时间、路径、域等属性 setcookie("stringa", rawurlencode($cookieValue), time() + 86400, "/");
- 读取Cookie时,用
rawurldecode()解码后再使用
echo rawurldecode($_COOKIE["stringa"]); // 输出完整的 "1 caffè al bar"
注意事项
不要使用urlencode()和urldecode()处理Cookie值,这两个函数会把空格处理为+,部分老旧客户端解析时可能出现二次转义问题。rawurlencode()遵循RFC 3986规范,对特殊字符的处理更符合Cookie标准要求,跨设备兼容性更好。
内容的提问来源于stack exchange,提问作者Mattia Bertoni
相关产品推荐
相关产品推荐

