У меня есть объект stdClass
называемый $post
который при сбрасывании через print_r()
возвращает следующее:
stdClass Object ( [ID] => 12981 [post_title] => Alumnus' Dinner Coming Soon [post_parent] => 0 [post_date] => 2012-01-31 12:00:51 )
Повторение результата вызова json_encode()
для этого объекта приводит к следующему:
{ "ID": "12981", "post_title": null, "post_parent": "0", "post_date": "2012-01-31 12:00:51" }
Я предполагаю, что что-то с одной цитатой вызывает json_encode
чтобы задохнуться, но я не знаю, какой формат нужен, чтобы избежать этого. Есть идеи?
EDIT: Исправлено несоответствие в примерах кода. Я запускаю PHP версию 5.3.8
EDIT2: сразу после кодирования объекта я сделал следующее:
echo json_last_error() == JSON_ERROR_UTF8;
Это напечатано 1
, что означает, что произошла следующая ошибка: «Недопустимые символы UTF-8, возможно, неправильно закодированные». json_last_error ()
EDIT3: Вызов utf8_decode()
в заголовке сообщения привел к следующему: «Ученик« utf8_decode()
скоро ». Эти данные извлекаются из базы данных MySQL – в частности, заголовок сообщения представляет собой текстовое поле, кодированное UTF-8. Может быть, эта одиночная кавычка неправильно закодирована? Дело в том, что у меня есть приложение GUI для SQL, и оно выглядит правильно.
Перед выполнением запросов необходимо установить кодировку соединения. Как это делается, зависит от API, который вы используете для подключения:
mysql_set_charset("utf8")
если вы используете старый, устаревший API . mysqli_set_charset("utf8")
если вы используете mysqli charset
в строку соединения, если вы используете PDO и PHP> = 5.3.6. В более ранних версиях вам нужно выполнить SET NAMES utf8
. Когда вы получаете данные из MySQL, любой текст будет закодирован в «клиентской кодировке», что, скорее всего, будет Windows-1252, если вы не настроите его иначе. Характер, вызывающий вашу проблему, – это «кудрявая цитата», которая рассматривается как 92
в шестнадцатеричном дампе, что подтверждает, что клиент mysql кодирует текст в windows-1252.
Еще одна вещь, которую вы можете рассмотреть, – это передать весь текст через utf8_encode
, но в этом случае он не даст правильного результата. PHP utf8_encode
PHP преобразует iso-8859-1 -кодированный текст. В этой кодировке \ x92 является непечатаемым управляющим символом, который будет преобразован в непечатаемый управляющий символ в utf-8. Вы можете использовать str_replace("\x92", "'", $input)
чтобы исправить проблему для этого конкретного символа, но если есть вероятность, что в базе данных будут какие-либо другие символы, отличные от ascii, вы хотите, чтобы клиент использует UTF-8.
То, что мне нужно было сделать в прошлом в json_encode по тексту с символами utf8, – это
json_encode( utf8_encode( $s ) );
и в некоторых случаях
json_encode( htmlspecialchars( utf8_encode( $s ) ) );
utf8_encode () для обработки специальных символов (обратите внимание, что это Encode, а не Decode)
htmlspecialchars () в зависимости от того, как вы хотите использовать строку JSON, вы можете оставить это
и, наконец, json_encode (), чтобы получить ваш пакет JSON.
Поскольку вы хотите json_encode для объекта, вам нужно сначала вызвать utf8_encode () для каждой текстовой части или написать простой рекурсивный utf8_encode (). Для примера вашего примера:
function myEncode($o) { $o->title = utf8_encode($o->title); return json_encode($o); }
У меня была такая же проблема, в то время как JSON-кодирование php-массива из результатов запроса ODBC, OBC моего сервера настроен на «en_US.819», это производственный сервер, поэтому я даже не могу его коснуться !!
когда я пытался:
echo json_encode($GLOBALS['response'], true);
Где «respose» представляет собой массив с результатами, он работает так, как предполагалось, поскольку не существует причудливого символа, если это так, json_encode не возвращается.
Решение? …. UTF кодирует результаты при извлечении строк из запроса:
$result = odbc_exec($conn, $sql_query); $response = array(); while( $row = odbc_fetch_array($result) ) { $json['pers_identificador'] = $row['pers_identificador']; $json['nombre_persona'] = utf8_encode( $row['nombre_persona'] ); $json['nombre_1'] = utf8_encode($row['nombre_1'] ); $json['nombre_2'] = utf8_encode($row['nombre_2'] ); array_push($response, $json); }
Теперь json_encode работает !!!, результирующая строка выглядит примерно так:
{"page_id":300,"max_rows":"100","cant_rows":"12897","datos": [{"pers_identificador":"301","cedula":"15250068","interno_1":"178202","interno_2":"","nombre_persona":"JOSE JUAN PANDOLFO ZAGORODKO","nombre_1":"JOSE","nombre_2":"JUAN",....
Это исправило мою проблему.
Я хотел бы рассказать вам об этой проблеме, по ссылке Я предлагаю вам использовать обертку json_encode следующим образом:
function safe_json_encode($value){ if (version_compare(PHP_VERSION, '5.4.0') >= 0) { $encoded = json_encode($value, JSON_PRETTY_PRINT); } else { $encoded = json_encode($value); } switch (json_last_error()) { case JSON_ERROR_NONE: return $encoded; case JSON_ERROR_DEPTH: return 'Maximum stack depth exceeded'; // or trigger_error() or throw new Exception() case JSON_ERROR_STATE_MISMATCH: return 'Underflow or the modes mismatch'; // or trigger_error() or throw new Exception() case JSON_ERROR_CTRL_CHAR: return 'Unexpected control character found'; case JSON_ERROR_SYNTAX: return 'Syntax error, malformed JSON'; // or trigger_error() or throw new Exception() case JSON_ERROR_UTF8: $clean = utf8ize($value); return safe_json_encode($clean); default: return 'Unknown error'; // or trigger_error() or throw new Exception() } } function utf8ize($mixed) { if (is_array($mixed)) { foreach ($mixed as $key => $value) { $mixed[$key] = utf8ize($value); } } else if (is_string ($mixed)) { return utf8_encode($mixed); } return $mixed; }
И после определения этих функций вы можете использовать его прямо,
echo safe_json_encode($response);
Вы можете попробовать установить кодировку в конфигурации базы данных:
'charset' => 'utf8', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' )