PHP的Json_encode函数将空格变为加号+

5
我有一个Web应用程序,我首先在Cookie中存储JSON数据,然后每x秒保存到数据库。它只是打开与服务器的连接,服务器读取Cookie。它并没有通过POST或GET发送任何东西。
当我保存到Cookie时,我的数据格式化得很好。但是,当我在PHP中处理它,然后设置一个新的json_encoded数组时,它会用+符号替换空格,然后这些符号会显示在我的Web应用程序中。我找不到任何禁用json_encode字符串编码的方法,也找不到解析这些加号符号的JS方法(使用jQuery.parseJSON;stringify的解析也不起作用)...有人有什么想法吗?:S

3
URL编码文本中,空格可以表示为“+”,而cookie也是URL编码的,以免在错误的时间解码。 - mu is too short
干杯。让我想起了urldecode。出于某种原因,这个方法有效:json_encode(urldecode($array)),我在最后重新设置cookie时使用了这个方法。但是在PHP读取cookie时解码没有任何效果。这让我觉得json_encode可能对其进行了某些处理? - Benno
+ 最初在哪里出现?当你从 cookie 中提取 JSON 时,你是否在客户端看到它?它是否首次出现在服务器上(在尝试将数据视为 JSON 之前)? - mu is too short
urldecode并没有真正解决它:p 哈哈..lol。好的,只有在我运行setcookie('order',json_encode($newCookie),time()+18000, '/');之后,+才会出现一次...我使用$.parseJSON(cookiecontents);进行解析。如果我从JavaScript保存数据到cookie中,那么就没问题。如果我重新加载页面并再次解析cookie以填写订单表格,则没有+。但是当我通过PHP设置cookie,然后解析它时,它会添加加号。这与它作为响应头从服务器传递有关吗? - Benno
好的,看起来JSON.stringify(objects)将空格编码为%20,但是setcookie或JSON encode会将它们编码为加号(在响应头中),而$.parseJSON()和JSON.parse()都无法将+转换为空格...设置cookie时没有设置编码类型的方法吗? - Benno
显示剩余2条评论
1个回答

6
精细手册中可以得知:
请注意,当发送cookie时,cookie的值部分将自动进行URL编码,并且在接收到它时,它将自动解码并分配给与cookie名称相同的变量。如果您不想要这个功能,可以使用setrawcookie(),前提是您正在使用PHP 5。
但我认为您仍然希望对cookie进行URL编码,只是希望空格使用%20而不是+。 然而,根据urlencode的描述:
由于历史原因,空格被编码为加号(+)字符。
您可以尝试使用rawurlencode进行手动编码:
返回一个字符串,其中所有非字母数字字符除了“-_.~”之外,都已替换为百分号(%)后跟两个十六进制数字。 这是RFC 3986中描述的编码方式。
然后使用setrawcookie来设置cookie。 不幸的是,decodeURIdecodeURIComponent或甚至是不推荐使用的unescape JavaScript函数都无法将+转换回空格;因此,您可能需要通过努力使所有人理解。

真的很奇怪,没有JavaScript解码可以将加号替换为空格。不过还是谢谢你提供这个信息,我查看了setcookie并搜索了解码,但可能因为我的眼瞎,没看到它,哈哈。无论如何,在将json_encoded数组设置为cookie之前,我设法通过对其进行url编码来修复它,使得该函数将所有空格编码为%20,而不是由setcookie编码为+。我也不知道setrawcookie的存在,谢谢! - Benno
@Benno:嘿,什么管用就用什么吧。 我也是几小时前才知道setrawcookie的存在 :) PHP不是我的强项,但PHP文档整体上还是相当不错的。 - mu is too short
1
其实,我之前用那种方式做遇到了问题哈哈。现在我改用setrawcookie和rawurlencode,没有问题了。之前没发现是因为当cookie被解析成JSON对象时,我使用了unescape。但由于unescape也会对其他字符造成问题,所以我将其删除了。 - Benno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接