PHP Json_encode 将空格更改为加号 +

Posted

技术标签:

【中文标题】PHP Json_encode 将空格更改为加号 +【英文标题】:PHP Json_encode changing spaces to plus symbols + 【发布时间】:2011-10-12 07:33:37 【问题描述】:

我有一个网络应用程序,我首先将 JSON 数据存储在 cookie 中,然后每隔 x 秒保存到数据库中。它只是打开到服务器的连接,然后服务器读取 cookie。它实际上并不通过 POST 或 GET 发送任何内容。

当我保存到 cookie 时,我的数据格式正确。但是,当我在 php 中使用它然后 setcookie 一个新的 json_encoded 数组时,它用 + 符号替换空格,然后这些显示在我的 Web 应用程序中。我找不到任何方法来禁用 json_encode 的字符串编码,也找不到解析这些加号的 JS 方法(使用 jQuery.parseJSON;stringify 的解析也不起作用)......有人知道吗:S?

【问题讨论】:

空格可以在 URL 编码文本中表示为 +,而 cookie 是 URL 编码的,因此有人没有在正确的时间解码。 干杯。让我想到了 urldecode。出于某种原因,这有效:json_encode(urldecode($array)),我在最后重新设置 cookie 时这样做。当 PHP 读入 cookie 时解码什么也没做。让我觉得 json_encode 可能会对它做些什么? + 第一次出现在哪里?当您从 cookie 中提取 JSON 时,您是否在客户端看到它?它是否首先出现在服务器上(在您尝试将数据视为 JSON 之前)? urldecode 实际上并没有修复它:p 哈哈.. 大声笑。好的,所以 + 只有在我运行 setcookie('order',json_encode($newCookie),time()+18000, '/'); 后才会显示...我使用 $.parseJSON(cookiecontents); 解析它如果我将数据从 javascript 保存到 cookie,那很好。如果我重新加载页面并再次解析 cookie 以填写订单,则没有 +s。但是当我通过 PHP 设置 cookie 然后解析它时,它增加了优点。与它作为响应标头从服务器传递有关吗?? 好吧,看起来 JSON.stringify(objects) 将空格编码为 %20,但随后 setcookie 或 JSON 编码,将它们编码为加号(在响应标头中)和 $.parseJSON() JSON.parse() 也不能将+转换为空格...设置cookie时无法设置编码类型吗? 【参考方案1】:

来自fine manual:

请注意,当您发送 cookie 时,cookie 的值部分会自动进行 urlencoded,当接收到时,它会自动解码并分配给与 cookie 名称同名的变量。如果你不想要这个,如果你使用的是 PHP 5,你可以使用 setrawcookie()

但我认为您仍然希望对 cookie URL 进行编码,您只希望 %20 用于空格而不是 +。但是,urlencode

[...] 由于历史原因,空格被编码为加号(+)

您可以尝试使用rawurlencode 自己编码:

返回一个字符串,其中除-_.~ 之外的所有非字母数字字符均已替换为后跟两个十六进制数字的百分号 (%)。这是 RFC 3986 [...]

中描述的编码

然后setrawcookie 设置cookie。不幸的是,decodeURIdecodeURIComponent 甚至已弃用的 unescape JavaScript 函数都不会将 + 转换回空格;所以,你可能会被困在艰难地强迫每个人理解。

【讨论】:

没有用空格替换加号的javascript解码真的很奇怪。不过,感谢您提供的信息,我查看了 setcookie 并搜索了解码,但我一定是瞎了眼,因为我没有看到,哈哈。无论哪种方式,我确实设法通过在将其设置为 cookie 之前对 json_encoded 数组进行 urlencoding 来修复它,这样所有空格都由该函数编码为 %20,而不是由 setcookie 编码。也不知道 setrawcookie 存在,谢谢!! @Benno:嘿,不管怎样。直到几个小时前我才知道setrawcookie :) PHP 不是我最擅长的语言,但 PHP 文档总体上相当不错。 实际上,我这样做有问题哈哈。我改为使用 setrawcookie 和 rawurlencode,现在没有问题了。我之前没有检测到它,因为当 cookie 被解析为 JSON 对象时我有 unescape。我删除了 unescape,因为它也会导致其他字符出现一些问题....

以上是关于PHP Json_encode 将空格更改为加号 +的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PHP 将 $_COOKIE 中的加号替换为空格?

PHP json_encode($arr) 为啥会改变数组的顺序,怎么解决。在线等

[踩坑]url传参+变空格

PHP使用urlencode对中文编码时空格加号的问题

将 PHP json_encode 数组发送到 jQuery

将 emacs ruby​​-mode 缩进更改为 4 个空格