0

现在,以我自己的观点,我已经尝试了有关此编码问题的所有方法,查看了许多已回答的问题,但对我没有任何帮助,所以我开始了。

我有一个带Users表的 MySQL 数据库。此表有一个“名字”列,排序规则设置为utf8_general_ci(所有 varchar 列都是)。然后我插入了一行,其中名字列设置为“Løw”,带有斯堪的纳维亚特殊字符“ø”。

我现在使用 php-ActiveRecord 库,其中连接字符串是“;charset=utf8”,来检索行,然后将用户输出为 json,如下所示:

$user = User::find($ID);
$userArr = $user->to_array();
header('Content-Type: application/json; charset=utf-8');
print(json_encode($userArr));

现在有线的东西开始了。名字现在不是 MySQL 数据库中显示的“Løw”,而是“L\u00f8w”。然后,我尝试查看没有该json_encode功能的情况是否也是如此,如下所示:

$user = User::find($ID);
$userArr = $user->to_array();
header('Content-Type: text/plain; charset=utf-8');
print_r($userArr);

但这里的输出是正确的,名字是“Løw”。然后我尝试将数组中的字段编码为utf-8,因为每个人都告诉我字符串utf-8是否应该工作,如下所示:

$return[] = array_map('utf8_encode', $userArr);
print_r(json_encode($return));

但这给了我"L\u00c3\u00b8w",所以没有用。然后我尝试了,因为我没有 utf8_decode 的想法:

$return[] = array_map('utf8_decode', $userArr);
print_r(json_encode($return));

但这使得字符串返回为"null"。然后我尝试检查我的变量从数据库中出来时的编码是什么,如下所示:

header('Content-Type: text/plain; charset=utf-8');
print(mb_detect_encoding($userArr['firstname']));

但这又回来了UTF-8

因此,希望您可以看到,我已经尝试了所有方法,但我仍然不知道为什么 myjson_encode将 "ø" 字符更改为"\u00f8"。请帮忙,我不想制作自己的 json_encode 方法。

4

1 回答 1

1

好的,很快就找到了答案,但我让其他斯堪的纳维亚人知道,因为我在这个主题上找不到任何东西。

我通过将以下内容添加到 json_encode 方法解决了这个问题:

print(json_encode($userArr,JSON_UNESCAPED_UNICODE));

这告诉方法不要转义 unicode 字符(我认为)或如 PHP 文档中所说:

JSON_UNESCAPED_UNICODE(整数)

对多字节 Unicode 字符进行逐字编码(默认转义为 \uXXXX)。自 PHP 5.4.0 起可用。

于 2013-06-13T13:42:40.330 回答