必须编码中文,因为cookie值仅允许ascii字符(0x20–0x7e),中文utf-8编码含超范围字节,直接写入会导致截断或报错;应使用encodeuricomponent/decodeuricomponent处理value,key建议用英文或数字。

JavaScript 中设置 Cookie 时遇到中文字符,必须手动编码,否则会因非法字符导致设置失败或乱码;读取时需对应解码,才能还原原始中文。
为什么必须编码中文?
Cookie 的值只允许 ASCII 字符(0x20–0x7E),空格、逗号、分号、等号、引号等都属于非法字符。中文 UTF-8 编码后通常包含字节值大于 0x7F 的序列(如“你好” → %E4%BD%A0%E5%A5%BD),直接写入会触发浏览器静默截断或报错。原生 document.cookie 不做任何编码处理,全靠开发者负责。
推荐:用 encodeURIComponent / decodeURIComponent
这是最标准、兼容性最好(支持所有现代浏览器及 IE8+)的方案,专为 URI 组件设计,恰好适配 Cookie 值的安全转义:
-
设置时编码:
document.cookie = "name=" + encodeURIComponent("张三") + "; path=/"; -
读取时解码:从
document.cookie取出值后,用decodeURIComponent(value)还原 - 注意:仅对 value 部分编码,key(cookie 名)也建议用英文或数字,避免潜在问题
不建议用 escape / unescape
escape() 已被废弃,不支持 Unicode 多字节字符(如中文会错误编码为 %u4F60 格式),且现代浏览器中行为不一致;unescape() 同样弃用。使用它们可能导致解码失败或安全风险,应彻底避免。
简单封装读写函数(实用示例)
可自行封装两个小函数,避免每次重复编码/解码:
function setCookie(key, value, options = {}) {
const encodedValue = encodeURIComponent(value);
let cookieStr = `${key}=${encodedValue}`;
if (options.expires) cookieStr += `; expires=${options.expires.toUTCString()}`;
if (options.path) cookieStr += `; path=${options.path}`;
if (options.domain) cookieStr += `; domain=${options.domain}`;
if (options.secure) cookieStr += "; secure";
if (options.sameSite) cookieStr += `; samesite=${options.sameSite}`;
document.cookie = cookieStr;
}
function getCookie(key) {
const match = document.cookie.match(new RegExp(`(^| )${key}=([^;]+)`));
return match ? decodeURIComponent(match[2]) : null;
}
调用:setCookie("username", "王五"); → 读取 getCookie("username") 返回 "王五"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











