php - json_encode 在处理多字节子字符串时返回 false

标签 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);

如你所见,

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

返回false,并且

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

返回正确的 json。

查看 json_last_error 时,我看到这是由于 格式错误的 UTF-8 字符,可能编码不正确。所以问题是 mb_substr 给了我格式错误的字符。

当我查看 var_dump($a); 时,我看到它生成 string(10) "ニ搭载�"(我假设每个日文字符为 3字节,而那个问号是格式错误的字符)。

那么我怎样才能以这种方式从字符串中获取子字符串,而不会得到格式错误的字符串呢?

最佳答案

只需将 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"

Demonstration

关于php - json_encode 在处理多字节子字符串时返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23455400/

相关文章:

php - 使用 password_hash() 和 password_verify() 的问题

php - 根据比较更改返回字段(MySQL)

javascript - 多个阵列的幻灯片计数器未重置

c# - 使用 Ajax 绑定(bind)时避免将太多 JSON 数据发送到 Telerik 网格的最佳方法是什么?

php - MySql:查找 table2.name WHERE table1.lat = table2.lat AND table1.lng = table2.lng;

php - 从 Android 应用程序创建新订单时如何使用 Woocommerce REST API 应用优惠券?

c++ - 字符串的 3D 数组

Java 整数流

javascript - $http服务从服务器下载json文件时抛出异常

ruby-on-rails - 通过 RubyGems 安装 JSON 1.8.1 时出错