您不应该对“expires=”进行编码。它会变成“expires%3D”,这不是你想要的。
除此之外,使用“encodeURI”可能不是一个好主意,因为它不编码“;”和 ',' 根据需要。
您可以使用encodeURIComponent对cookie值进行编码,但使用escape()对cookie值进行编码在技术上是正确的。
So...
document.cookie = "count=" + encodeURIComponent(count.toString()) + "; expires=" + exDate.toUTCString();
...应该做你想做的事。
cookie 由几个部分组成;我们最感兴趣的是名称、价值和有效期。
(官方回答完)
让我们澄清一下关于 cookie 编码的困惑
如果有任何疑问,请联系 RFC,不要只选择在网络上找到的任何看起来有效的内容。
cookie 名称的类型token https://www.rfc-editor.org/rfc/rfc2616#page-17,这意味着其中只允许使用以下值:
0x21-0x27, 0x2A-0x2B, 0x2D-0x2E, 0x30-0x39, 0x41-0x5A, 0x5E-0x7A and 0x7E.
换句话说:以下值应该进行百分比编码:
0x00-0x20, '(', ')', ',', '/', ':', ';', '<', '=', '>', '?', '@', '', '[', ']', '{', '}' and 0x7F-0xFF.
cookie 值的类型cookie 八位组 https://www.rfc-editor.org/rfc/rfc6265#page-9,这意味着其中只允许使用以下值:
0x21、0x23-0x2B、0x2D-0x3A、0x3C-0x5B、0x5D-0x7E.
换句话说:以下值应该进行百分比编码:
0x00-0x20, 0x22, ',', ';', '' and 0x7F-0xFF.
现在,到期日期是使用 toUTCString() 进行编码的,正如您所做的那样。
结果看起来像这样:2021 年 6 月 9 日星期三 10:18:14 GMT- 所以它将包含一个逗号。但!除了 cookie 名称和 cookie 值字符串之外,您不应该对任何内容进行编码。
Note: W3学校 http://www.w3schools.com/jsref/jsref_escape.asp说 escape() 在 JavaScript 1.5 中已被弃用,但从技术上来说,对 cookies 使用encodeURI() 或encodeURIComponent() 是不正确的。对 cookie 使用 escape() 从技术上来说是正确的。
RFC 6265 第 5.4 节 https://www.rfc-editor.org/rfc/rfc6265#section-5.4明确指出:
注意:尽管有它的名字,cookie-string实际上是一个序列
八位位组,而不是字符序列。转换 cookie 字符串
(或其组成部分)转换为字符序列(例如,
呈现给用户),用户代理可能希望尝试使用
用于解码八位位组序列的 UTF-8 字符编码 [RFC3629]。
然而,这种解码可能会失败,因为并非每个序列
八位字节是有效的 UTF-8。
由于decodeURIComponent()适用于unicode字符串,并且会阻塞0x00和0xFF之间的字节值,因此它们can not安全使用。
另一方面,unescape() 是not对于字符串,但对于 8 位字节序列,又名。octets,但前提是您的字节序列不包含 unicode 字符。
如果您的 cookie 值包含 unicode 字符,您should但是,使用encodeURIComponent()/decodeURIComponent(),但您还应该捕获任何异常,因为服务器可能不会准确地向您发送您想要接收的内容。