了解PHP/JSON中的u0000是什么并将其删除


Understanding what u0000 is in PHP / JSON and getting rid of it

我不知道发生了什么,但我在数组中有一个字符串。它一定是一个字符串,因为我首先在上面运行了这个:

$array[0] = (string)$array[0];

如果我以纯文本形式将$array[0]输出到浏览器,它会显示以下内容:

hellothere

但如果我对$array进行JSON编码,我会得到:

hello'u0000there

此外,我需要分离"there"部分(''u0000之后的位),但这不起作用:

explode(''u0000', $array[0]);

我甚至不知道''u0000是什么,也不知道如何在PHP中控制它。

我确实看到了这个链接:试图从我的json中找到并删除这个''u0000…这建议str_replaceing生成的JSON。我不能做到这一点(需要像上面提到的那样先将其分离),所以我在谷歌上检查了"php反斜杠''0字节检查",但我仍然不知道该怎么办。

'uXXXX是JSON Unicode转义表示法(X是十六进制)。

在这种情况下,它意味着0 ASCII字符,也就是NUL字节,要拆分它,您可以执行以下操作之一:

explode(''u0000', json_encode($array[0]));

或者更好:

explode("'0", $array[0]); // PHP doesn't use the same notation as JSON

您所拥有的字符串是"hello'0world""hello'x00world",无论您喜欢什么。如果您echo它,空符号'0将不会显示,这就是为什么您会看到helloworld,但json_encode会检测到它并将其转义为任何其他特殊字符,这就是它被可见的'u0000字符串取代的原因。

在我看来,json完美地编码了字符串,'u0000在那里以json编码的方式复制输入的字符串。你不必触摸它的输出。如果您不希望'u0000在那里,您应该修复其输入

您可以简单地执行trim($str),而不必给它一个江湖骗子

万一有人需要它来应用于整个阵列

$data = (array)json_decode(str_replace(''u0000*'u0000', '', json_encode($data)));

'uXXXX是unicode符号,代码为XXXX(十六进制)。例如:http://msdn.microsoft.com/en-us/library/aa664669(v=vs.71).aspx

如果你真的得到了0000,那么它只是代码为0的字符

我今天遇到了这个问题,在将其发送回客户端之前,我将数组中的''u0000替换为",从而解决了这个问题。

echo str_replace('''u0000', "", json_encode($send));

在我的例子中,我在序列化的Laravel作业的有效负载json中找到了符号,类似于s:8:"'0*'0order";(或s:8:"'u0000*'u0000order";),这意味着序列化对象的属性order在序列化的时刻具有可见性protected

尝试explode("'u0000", $array[0]);,确保使用双引号。使用单引号,它将解析文本中的6个字符的值。

正如其他人所提到的,'u0000是Unicode NUL字符。