Проблемы с немецкими умляутами в php json_encode
У меня возникают проблемы с данными из базы данных, содержащей немецкие умлауты. В принципе, всякий раз, когда я получаю данные, содержащие умлауты, это черный квадрат с меткой опроса. Я решил это, поставив
mysql_query ('SET NAMES utf8')
перед запросом.
Проблема заключается в том, что, как только я использую json_encode(...)
в результате запроса, значение, содержащее umlaut, получает null
. Я вижу это, вызывая php файл непосредственно в браузере. Есть ли другое решение, чем замена этих символов перед кодированием на JSON и декодирование его в JS?
Ответы
Ответ 1
Вероятно, вы просто хотите показать тексты как-то в браузере, поэтому одним из вариантов было бы изменение умляутов на объекты HTML с помощью htmlentities()
.
Для меня работал следующий тест:
<?php
$test = array( 'bla' => 'äöü' );
$test['bla'] = htmlentities( $test['bla'] );
echo json_encode( $test );
?>
Ответ 2
Я знаю, что это может быть старым, но здесь лучшее решение:
Определите тип документа с помощью кодировки utf-8:
<?php header('Content-Type: application/json; charset=utf-8'); ?>
Убедитесь, что все содержимое utf_encoded. JSON работает только с utf-8!
function encode_items(&$item, $key)
{
$item = utf8_encode($item);
}
array_walk_recursive($rows, 'encode_items');
Надеюсь, это поможет кому-то.
Ответ 3
Посмотрите на это довольно элегантное решение, упомянутое здесь:
json_encode($json_full, JSON_UNESCAPED_UNICODE);
Если проблема не в другом месте вашего кода, это должно исправить ее.
Ответ 4
Единственным важным моментом здесь является то, что json_encode() поддерживает только кодировку UTF-8.
http://www.php.net/manual/en/function.json-encode.php
Все строковые данные должны кодироваться в кодировке UTF-8.
Поэтому, когда у вас есть специальные символы в строке un utf-8, json_encode вернет значение null.
Таким образом, либо вы переключите весь проект на utf-8, либо убедитесь, что вы используете utf8_encode() любую строку перед использованием json_encode().
Ответ 5
убедитесь, что сам файл перевода был явно сохранен как UTF-8
После этого перезагрузите кеш-блоки и переводы