проблемы с немецкими умляутами в php кодировании json
У меня проблемы с данными из базы данных, содержащей немецкие умлауты. В принципе, всякий раз, когда я получаю данные, содержащие умлауты, это черный квадрат со знаком допроса. Я решил эту проблему, поставив
mysql_query ('SET NAMES utf8')
Перед запросом.
Проблема в том, что как только я использую json_encode(...)
в результате запроса, значение, содержащее умляут, получает null
. Я могу убедиться в этом, вызвав php-файл непосредственно в браузере. Есть ли другое решение, кроме замены этих символов раньше кодирование в JSON и декодирование в JS?
5 answers
Вероятно, вы просто хотите каким-то образом отобразить тексты в браузере, поэтому одним из вариантов было бы изменить умлауты на HTML-объекты с помощью htmlentities()
.
Для меня сработал следующий тест:
<?php
$test = array( 'bla' => 'äöü' );
$test['bla'] = htmlentities( $test['bla'] );
echo json_encode( $test );
?>
Ознакомьтесь с этим довольно элегантным решением, упомянутым здесь:
json_encode($json_full, JSON_UNESCAPED_UNICODE);
Если проблема больше нигде в вашем коде не обнаружена, это должно исправить ее.
Я знаю, что это может быть старым, но здесь лучшее решение:
Определите тип документа с помощью кодировки 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');
Надеюсь, это кому-то поможет.
Единственным важным моментом здесь является то, что json_encode() поддерживает только кодировку UTF-8. http://www.php.net/manual/en/function.json-encode.php
Все строковые данные должны быть закодированы в кодировке UTF-8.
Поэтому, если у вас есть какие-либо специальные символы в строке, отличной от utf-8, json_encode вернет нулевое значение.
Поэтому либо вы переключаете весь проект на utf-8, либо убедитесь, что вы utf8_encode() любую строку, прежде чем использовать json_encode().
Убедитесь, что сам файл перевода был явно сохранен как UTF-8
После этого перезагрузите блоки кэша и переводы