处理多字节子串时,json_encode返回false

6

我正在使用几乎最新版本的php(5.5.11),这里出现了问题。当我对字符串的一部分使用json_encode时,它返回false。一开始我使用的是substr,但后来我意识到使用这个函数处理非英文字符串是完全错误的。但即使我使用了mb_substr,我仍然看到json_encode返回false:

$s = "に搭載されるようになると、その手軽さからJは急速に普及していく。、通信に関する標準を策定する国際団体インターナショナル";
$a = mb_substr($s, 0, 10);

如您所见,

var_dump( json_encode([
    'd' => $a
]) );

返回 false
var_dump( json_encode([
    'd' => $s
]) );

返回正确的json。

当查看 json_last_error 时,我发现这是由于 Malformed UTF-8 characters, possibly incorrectly encoded。因此问题是 mb_substr 给出了格式错误的字符。

当我查看 var_dump($a); 时,我看到它产生了 string(10) "に搭載�"(我假设每个日语字符占3个字节,那个问号就是格式错误的字符)。

那么如何从字符串中获取子字符串,以便不会得到格式错误的字符串呢?

1个回答

6

只需将utf-8编码作为mb_substr()的第四个参数传递,您就可以开始使用了。

$a = mb_substr($s, 0, 10,'utf-8');
echo $a; // に搭載されるようにな
echo json_encode($a); // "\u306b\u642d\u8f09\u3055\u308c\u308b\u3088\u3046\u306b\u306a"

演示

该链接是一个演示页面。

1
如果这解决了问题,那么这是否意味着您的 mb_internal_encoding 没有设置为 'utf-8'?正确设置内部编码难道不是更好的解决方案吗? - Darren Cook

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