【问题标题】:Understanding what \u0000 is in PHP / JSON and getting rid of it了解 PHP / JSON 中的 \u0000 是什么并摆脱它
【发布时间】:2013-07-04 05:02:58
【问题描述】:

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

$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 字节”,但我仍然不知道该怎么做。

【问题讨论】:

标签: php json


【解决方案1】:

\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

【讨论】:

  • explode("\0", $array[0]) - 就是这样。其他人都没有工作。我会尽快接受答案。谢谢
  • PHP 不理解字符串中的 \uHHHH 表示法。
  • @Nicholas:对。不过它确实理解\HH
  • ...或者更好str_replace('\0', '', $json_data)
  • @MihaiStancu:是的,但这不会像 OP 想要的那样分开。
【解决方案2】:

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

在我看来,json 完美地对字符串进行了编码,\u0000 可以完成以 json 编码方式再现输入字符串的工作。您不必触摸它的输出。如果你不想要那个\u0000,你应该改正它的input

【讨论】:

  • 如何修复输入,我有一个 UTF-8 编码文件 - 但我无法在其中找到任何空字符 - 请帮助
  • @almaruf 当然是在编码之前从字符串中删除字符。是的,不会显示空字符,并且给您的印象是它们根本不存在,但在二进制级别它们是存在的,str_replace() 将能够找到并替换它们。
【解决方案3】:

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

【讨论】:

  • 很好的答案!谢谢
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

          • 除了它是\u0000 而不是\0000
          猜你喜欢
          • 1970-01-01
          • 2021-04-03
          • 1970-01-01
          • 2015-02-02
          • 2022-08-18
          • 2019-06-08
          • 1970-01-01
          • 2023-03-17
          • 2017-08-29
          相关资源
          最近更新 更多