【问题标题】:Safari writes trash to document.cookies instead non-ascii charactersSafari 将垃圾写入 document.cookies 而不是非 ascii 字符
【发布时间】:2016-11-20 23:36:08
【问题描述】:

我有下一个 javascript 代码的 sn-p:

wdata['account'] = {"value": $(input).val(), "title": "Номер карты получения"};
var r = {"ipayway": ipw_selected,
        "wpayway": wpw_selected,
        "amount_type": amount_type,
        "amount": amount,
        "email": email,
        "idata": idata,
        "wdata": wdata,
        "udata": udata
      }
console.log(JSON.stringify(r));
document.cookie = "r=" + JSON.stringify(r) + ";";
console.log(document.cookie);

在 chrome 和 firefox 中调试结果:

{"ipayway":"3","wpayway":"2","amount_type":"invoice","amount":"10","email":"refer@faster.com","idata":{"phone":{"value":"79111111111","title":"phone"}},"wdata":{"account":{"value":"4444444444444448","title":"Номер карты получения"}},"udata":{}}

_ga=GA1.2.1726207989.1464355649; _ym_uid=1464355650833173718; _ym_isad=2; r%3Dfalse%3B; r={"ipayway":"3","wpayway":"2","amount_type":"invoice","amount":"10","email":"refer@faster.com","idata":{"phone":{"value":"79111111111","title":"phone"}},"wdata":{"account":{"value":"4444444444444448","title":"Номер карты получения"}},"udata":{}}; _gat=1; _ym_visorc_37606275=w

在野生动物园中:

{"ipayway":"3","wpayway":"2","amount_type":"invoice","amount":"10","email":"refer@faster.com","idata":{"phone":{"value":"79111111111","title":"phone"}},"wdata":{"account":{"value":"4444444444444448","title":"Номер карты получения"}},"udata":{}}


r={"ipayway":"3","wpayway":"2","amount_type":"invoice","amount":"10","email":"refer@faster.com","idata":{"phone":{"value":"79111111111","title":"phone"}},"wdata":{"account":{"value":"4444444444444448","title":"A1468837743323372246t%3A1468837754%3A; ga=GA1.2.1861993315.1468837742; gat=1; ym_isad=2; ym_uid=1468837743323372246; _ym_visorc_37606275=w

我不知道会发生什么。为什么而不是 "title":"Номер карты получения" 就像在 chrome 或 firefox 中一样,我在 safari "title":"A1468837743323372246t%3A1468837754%3A 中得到了这个垃圾。如果您在调试结果中比较大括号,safari 也确实会切断最后一个闭合的大括号。

【问题讨论】:

  • 如果您尝试将 cookie 设置为具有与 JSON 中出错的相同“Номер карты получения”文本的简单字符串,会发生什么情况?或者,如果您存储带有使用标准英文字母的标题的 JSON?
  • document.cookie = 'r="Номер карты получения"'; "_ym_isad=2; _ym_uid=1468841469115532439; r=\"z"
  • @nnnnnn 如果您看到调试结果 JSON.stringify 会产生正确的结果。但是当我尝试将带有非 ascii 符号的字符串写入 cookie 时,只保存垃圾

标签: javascript json cookies safari cross-browser


【解决方案1】:

您需要在 HTML Meta Tag 和 javascript 中添加“charset=utf-8”。

<meta charset="utf-8">

<script type="text/javascript" charset="utf-8" src="/js/xxx.js"></script>

【讨论】:

  • 感谢您的回复。我刚试过这个。没有解决问题。
【解决方案2】:

我在https://stackoverflow.com/a/1969339/3960038Safari simply refuses to send any cookie containing non-ASCII characters 找到了非常有用的信息,这就是为什么跨浏览需要使用encodeURIComponent

在我的情况下是:

wdata['account'] = {"value": $(input).val(), "title": encodeURIComponent("Номер карты получения")};
var r = {"ipayway": ipw_selected,
    "wpayway": wpw_selected,
    "amount_type": amount_type,
    "amount": amount,
    "email": email,
    "idata": idata,
    "wdata": wdata,
    "udata": udata
  }
document.cookie = "r=" + JSON.stringify(r) + ";

Cookie 将包含title 值:%D0%9D%D0%BE%D0%BC%D0%B5%D1%80%20%D0%BA%D0%B0%D1%80%D1%82%D1%8B%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F,可以在后端轻松处理。例如在python中:

import urllib
title = '%D0%9D%D0%BE%D0%BC%D0%B5%D1%80%20%D0%BA%D0%B0%D1%80%D1%82%D1%8B%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F'
>>> print urllib.unquote(a)
Номер карты получения

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2022-07-21
    • 2021-11-05
    • 2020-07-29
    • 2022-08-18
    相关资源
    最近更新 更多