根本原因是原始 Cookie 规范仅支持 ASCII 字符,解决方法是统一用 encodeURIComponent/decodeURIComponent 进行 UTF-8 编解码,确保前后端、HTML 和 HTTP 头均采用 UTF-8,并推荐使用 js-cookie 库自动处理。

JavaScript 中 Cookie 处理中文和特殊字符(如 emoji、全角标点、空格、分号等)出乱码,根本原因在于原始 HTTP Cookie 规范只允许 ASCII 字符。浏览器对非 ASCII 内容的处理不一致,直接写入会导致截断、丢弃或解析失败。核心解决思路是:统一用 UTF-8 编码 + URL 编码,且写入与读取必须严格配对。
用 encodeURIComponent / decodeURIComponent 全程编解码
这是当前最标准、兼容性最好的做法,替代已废弃的 escape/unescape:
- 设置 Cookie 前,对 value(以及 name,如有非常规字符)调用
encodeURIComponent() - 从
document.cookie中提取值后,立即用decodeURIComponent()还原 - 它基于 UTF-8,能正确处理汉字、“?”、中文引号、顿号等所有 Unicode 字符
- 避免手动拼接字符串时漏掉编码——例如
document.cookie = "name=" + value + "; path=/"是危险的
前后端编码必须协同一致
如果 Cookie 由后端设置(如 Java、Node.js),前端读取时乱码,大概率是两端编码方式不匹配:
- Java 后端应使用
URLEncoder.encode(value, "UTF-8")编码,URLDecoder.decode(value, "UTF-8")解码 - Node.js 可直接用
encodeURIComponent(),或querystring.escape()(需注意版本差异) - 确保 HTML 页面声明 UTF-8:
<meta charset="UTF-8"> - HTTP 响应头中应包含
Content-Type: text/html; charset=UTF-8
封装安全读写逻辑或直接用 js-cookie
手写正则解析 + 编解码易出错,推荐两种稳妥方式:
立即学习“Java免费学习笔记(深入)”;
- 自己封装工具函数:设置时自动编码,读取时自动解码,并处理
path、expires等属性 - 更推荐直接使用 js-cookie 库:它默认启用 RFC 6265 兼容的 URL 编解码,自动处理引号包裹、特殊字符转义,体积仅 ~800 字节,支持 IE8+,且 API 简洁
- 示例:
Cookies.set('user', '张三❤️'); console.log(Cookies.get('user')); // 正确输出“张三❤️”
警惕旧环境(如 IE8–9)的兼容陷阱
IE8 及以下不支持 encodeURIComponent 对部分 Unicode 字符的正确编码,若必须兼容:
- 可加兜底逻辑:
try { return decodeURIComponent(str); } catch(e) { return unescape(str); }(仅限过渡期) - 避免在路径中使用文件名(如
path=/login.html),IE 会因此无法读取 Cookie,统一设为path=/ - 域名未指定时,IE 默认发送到所有子域,而其他浏览器只发当前域,建议显式设置
domain=.example.com


















