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

Sal*_*ali 5 php arrays json function mbstring

我使用几乎最新版本的PHP(5.5.11),这是问题所在.当我使用json_encode字符串的一部分时,它返回false.在我开始使用的时候substr,但后来我意识到在处理非英语字符串时这是完全错误的.但即使在我使用后,mb_substr我仍然看到json_encode回报false:

$s = "????????????????????J??????????????????????????????????????";
$a = mb_substr($s, 0, 10);
Run Code Online (Sandbox Code Playgroud)

正如你看到的,

var_dump( json_encode([
    'd' => $a
]) );
Run Code Online (Sandbox Code Playgroud)

回归false,和

var_dump( json_encode([
    'd' => $s
]) );
Run Code Online (Sandbox Code Playgroud)

返回正确的json.

在研究json_last_error时,我发现这是由于Malformed UTF-8 characters, possibly incorrectly encoded.所以问题是mb_substr给了我畸形的字符.

当我var_dump($a);看到它看到它产生string(10) "????"(我假设每个日语字符是3个字节,并且该问号是格式错误的字符).

那么如何以这种方式从字符串中获取子字符串,以至于我不会得到格式错误的字符串?

Sha*_*ran 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"
Run Code Online (Sandbox Code Playgroud)

Demonstration