Проблемы с немецкими умляутами в 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

После этого перезагрузите кеш-блоки и переводы