Php json_encode() показывает значение null вместо текста
Я читаю из базы данных с некоторым текстом на иврите и пытаюсь json_encode
его.
если я print_r
результаты я получают:
Array
(
[0] => Array
(
[value] => 88
[text] => כיתה א'
[parent_id] => 1
[level] => 1
)
[1] => Array
(
[value] => 89
[text] => כיתה ב'
[parent_id] => 1
[level] => 1
)
[2] => Array
(
[value] => 91
[text] => כיתה ג'
[parent_id] => 1
[level] => 1
)
)
в то время как json_encode показывает:
[{"value":"88","text":null,"parent_id":"1","level":"1"},{"value":"89","text":null,"parent_id":"1","level":"1"},{"value":"91","text":null,"parent_id":"1","level":"1"}]
Я верю, потому что мой текст из базы данных содержит метку (').
пробовал различные комбинации stripslashes или real_escape_string, никому не помогли.
Ответы
Ответ 1
json_encode
ожидает, что строки в данных будут закодированы как UTF-8.
Преобразуйте их в UTF-8, если они еще не были:
$results = array_map(function($r) {
$r['text'] = utf8_encode($r['text']);
return $r;
}, $results);
echo json_encode($results);
Ответ 2
Лучшее и быстрое решение, которое я нашел, было в самой ссылке PHP, Sam Barnum
$encodedArray = array_map(utf8_encode, $rawArray);
Ответ 3
$dbh = new PDO('mysql:host=localhost;dbname=test',
$user,
$pass
);
$dbh->exec("SET CHARACTER SET utf8");
или
$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname",
$dbuser,
$dbpass,
array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
Ответ 4
Попробуйте json_encode($string, JSON_UNESCAPED_UNICODE);
(только для PHP v5.4.0 + - см. docs).
Ответ 5
function change_null($d)
{
if (is_array($d)) {
foreach ($d as $k => $v) {
$d[$k] = change_null($v);
}
} else if(is_null($d))
{
return '';
}
return $d;
}
Эта рекурсивная функция изменит пустые значения на пустую строку. При вызове json_encode ($ your_array) в json_encode (change_null ($ your_array));
Ответ 6
Одним из самых простых способов является установка запроса CHARSET для MySQL. Если вы хотите установить одну и ту же кодировку для всех своих запросов, просто добавьте следующее в свою конфигурацию или файл подключения к базе данных.
mysql_query('SET CHARACTER SET utf8');
Если вы просто хотите его использовать для определенных запросов, просто используйте это прямо перед выполнением своих запросов