如何将二进制字符串转换为普通字符串。json_encode 二进制字符串返回 false。

3

我看到过,b在某些东西前面表示二进制。

我从MS DB接收到一个文本字段,列类型为CLOB。 我正在使用Laravel,当我使用die dump (dd())时,我看到:

b"""
My big text
"""

如果我创建一个简单的字符串并使用dd()函数打印它,我会看到:
"My big text"

问题在于json_encode()在这个二进制字符串上返回false,但简单字符串没有问题。
请问如何将其转换为简单字符串?
附注:我已经尝试过unpack(),但不成功。
编辑:实际上,json_encode()与此二进制字符串无关。它失败是因为存在非utf8符号。我看到的是...(22:45 – 0:15 CEST)...,但当我使用utf8_decode($text)时,我看到的是...(22:45 ? 0:15 CEST)...,如果现在尝试json_encode(),它会完美地工作。

@RiggsFolly 我看到我的字符串和平常的字符串一样,只是在开头用b"""代替了",在结尾用"""代替了"。 - undefined
请问您能否给我们展示一下这个表的模式? - undefined
@RiggsFolly 是的,我正在等待其他人的回答,这不是我的数据库。数据类型是:CLOB - undefined
1
我在与Laravel相关的情况下多次看到这个奇怪的b""字符串,但是没有明确的答案说明它是什么。事实上,PHP并没有两种类型的字符串。它只有一种字符串类型,而且它总是“二进制”的。b可能只是dd出于某种原因添加的东西。对于相同的值,var_dump会给出什么结果? - undefined
1
@Nevermore b 不是字符串本身的一部分,它只是调试输出。 - undefined
显示剩余6条评论
1个回答

2
PHP没有“二进制”和“非二进制”字符串。它只有字符串,并且它们始终是“二进制的”,因为它们就像字节数组一样运作。前缀“b”是由Symfony VarDumper组件添加的,表示该字符串不是有效的UTF-8编码。可以争辩说UTF-8应该是当今唯一明智的编码,显然Symfony认为任何其他编码都是“二进制的”,即非典型文本。
这也是您的json_encode失败的原因。

FWIW,b是一个提议的向前兼容前缀,用于为PHP代码准备PHP 6,该版本应具有非常类似Python的二进制字符串和Unicode字符串。 只是 PHP 6 从未实现,b 前缀仍然没有任何作用。Symfony 看起来已经全力以赴并采用了 Python 的b"""约定。


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