17

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

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

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

hellothere

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

hello\u0000there

另外,我需要将“那里”部分(\u0000 之后的位)分开,但这不起作用:

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

我什至不知道 \u0000 是什么或如何在 PHP 中控制它。

我确实看到了这个链接:Trying to find and get rid of this \u0000 from my json ...这表明 str_replacing 生成的 JSON。我不能这样做(并且需要先如上所述将其分开),所以我检查了谷歌的“php 检查反斜杠 \0 字节”,但我仍然不知道该怎么做。

4

8 回答 8

12

您拥有的字符串是"hello\0world",或者"hello\x00world"您喜欢的任何字符串。如果您这样做,则不会显示echo空符号,这就是您看到的原因,但会像对任何其他特殊字符一样检测并转义它,这就是为什么将其替换为可见字符串的原因。\0helloworldjson_encode\u0000

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

于 2013-07-06T05:30:39.657 回答
12

\uXXXX是 JSON Unicode 转义符号(X是十六进制)。

在这种情况下,这意味着0ASCII 字符,也就是 NUL 字节,你可以这样做:

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

或者更好:

explode("\0", $array[0]); // PHP doesn't use the same notation as JSON
于 2013-07-06T05:24:43.220 回答
10

你可以简单地做trim($str)而不给它一个charlist

于 2014-05-10T11:30:20.590 回答
2

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

如果你真的得到0000- 那么它只是带有代码的字符0

于 2013-07-06T05:24:28.560 回答
2

我今天遇到了这个问题,我通过将数组中的 \u0000 替换为 "" 来解决它,然后再将其发送回客户端。

echo str_replace('\\u0000', "", json_encode($send));
于 2014-04-09T09:10:28.557 回答
2

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

于 2020-01-10T19:26:35.607 回答
1

以防万一有人需要将其应用于整个数组

$data = (array)json_decode(str_replace('\u0000*\u0000', '', json_encode($data)));
于 2021-01-28T16:23:24.010 回答
0

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

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

于 2013-07-06T05:25:55.660 回答