【问题标题】:json_encode() returns false when I pass it non-ascii charactersjson_encode() 在我传递非 ascii 字符时返回 false
【发布时间】:2021-12-31 11:21:52
【问题描述】:

当我运行以下代码时,json_encode() 返回 false(错误)。有谁知道为什么?

$r = json_encode(chr(128));
var_dump($r);

结果是:

bool(false)

【问题讨论】:

标签: php json


【解决方案1】:
var_dump(chr(128));

chr(128) 是格式错误的 UTF-8 字符。 json_encode() 无法编码格式错误的 UTF-8 字符。

JSON 标准

https://datatracker.ietf.org/doc/html/rfc8259#section-1

JSON 可以表示四种基本类型(字符串、数字、布尔值、 和 null)和两种结构化类型(对象和数组)。

字符串是零个或多个 Unicode 字符的序列

json_encode() 带有标志。

如果您运行的是 PHP 7.3 或更高版本,您可以尝试使用此代码来抛出错误消息。

var_dump(json_encode(chr(128), JSON_THROW_ON_ERROR));

结果:

致命错误:未捕获的 JsonException:格式错误的 UTF-8 字符,可能编码不正确。

为防止出现错误,请使用JSON_INVALID_UTF8_IGNORE 标志,但这仍然不能编码无效字符。

例子:

var_dump(json_encode(chr(128), JSON_INVALID_UTF8_IGNORE));

结果:

字符串 '""' (长度=2)

清理字符串。

您可以使用此代码清理字符串以删除任何无效/格式错误的字符。

$string = chr(128);
$string = mb_convert_encoding($string, 'UTF-8', 'UTF-8');
// then encode
var_dump(json_encode($string));// result is string '"?"' (length=3)

【讨论】:

  • 另外注意:根据 JSON 规范,所有 JSON 字符必须是有效的 UTF-8
  • 谢谢@apokryfos
  • 非常感谢您的回答@vee
猜你喜欢
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2019-04-29
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多