【问题标题】:php json_encode() is encoding in a way that JavaScript JSON.parse can't decodephp json_encode() 以 JavaScript JSON.parse 无法解码的方式编码
【发布时间】:2015-04-22 21:19:52
【问题描述】:

我正在尝试在 PHP 和 Javascript 之间工作,读取和写入包含我在 JS 和 PHP 中读入数组的 json 值的相同 cookie。

如果我在我的 php 数组中保存使用 json_encode() 的 cookie,我发现生成的 cookie 的内容都已编码,就像 url 编码一样。

问题在于,当我尝试读取该 cookie 并使用

解码 JSON 时
var existing_array = readCookie('cookie_name');
JSON.parse(existing_array)

我收到一个 javascript 错误(例如 Uncaught SyntaxError: Unexpected token %)

如果我使用基于浏览器的 cookie 阅读器,我可以看到该数组在通过 javascript 保存时很容易读取: ["644","636"].

但是,当通过 json_encode() 函数在 PHP 中创建数组时,结果内容最终会类似于:%5B%22644%22%5D。

如果没有发生这种编码,我相信 JS 函数可以对其进行解码。有没有其他人经历过这个?我在 Windows 8 和最新的 Chrome 浏览器上使用 PHP 5.5。

【问题讨论】:

  • 不能用JS解码吗? decodeURI( readCookie('...') )
  • cookie 中的内容是 URL 编码的。如果你想正确地JSON.parse它,请先解码它。

标签: javascript php json


【解决方案1】:

Cookie 需要填充在 HTTP 标头中,以便对其进行编码以进行传输:

setcookie('cookie_name', '["644","636"]');

...触发器:

Set-Cookie: cookie_name=%5B%22644%22%2C%22636%22%5D

...浏览器将其发回:

Cookie: cookie_name=%5B%22644%22%2C%22636%22%5D

您的readCookie() 函数应该负责正确解码数据,但似乎没有。如果你想修复它,你可以从 e.g. 中获取一些想法。 jquery-cookie插件:

function parseCookieValue(s) {
    if (s.indexOf('"') === 0) {
        // This is a quoted cookie as according to RFC2068, unescape...
        s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
    }

    try {
        // Replace server-side written pluses with spaces.
        // If we can't decode the cookie, ignore it, it's unusable.
        // If we can't parse the cookie, ignore it, it's unusable.
        s = decodeURIComponent(s.replace(pluses, ' '));
        return config.json ? JSON.parse(s) : s;
    } catch(e) {}
}

请注意decodeURIComponent 部分。

【讨论】:

    【解决方案2】:

    谢谢@Evilzebra,它只是在解决它的JS的开头添加了decodeURIComponent。

    decodeURIComponent(readCookie('cookie_name'));
    

    【讨论】:

    • 看起来像一个凌乱的解决方案。为什么要使用无法正确读取 cookie 的readCookie() 函数?
    • JSON.parse($.cookie(cookie_name')) 似乎是一个更好的解决方案,参考stackoverflow.com/questions/18318545/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2018-10-02
    • 2013-06-08
    • 2014-09-27
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多