2011-11-15 4 views
11

Я читаю из базы данных с некоторым текстом на иврите и пытаюсь сделать json_encode. если я print_r результаты я получаю:php json_encode() show's null вместо текста

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, никому не помогли.

+0

Это не ' '' цитата. Скорее всего, ваша кодировка текста не UTF-8. Или в какой кодировке таблицы базы данных есть? – mario

+0

Какую кодировку символов вы используете? Проблема определенно выглядит с отсутствующим », похоже, что вам нужно очистить данные от db, закодировав его до UTF-8. –

+0

json_encode работает только с строками utf-8 в соответствии с документами. проверьте вывод 'json_last_error()'. http://php.net/json-last-error. utf8 кодирует ваши строки перед вызовом json_encode. –

ответ

19

json_encode ожидает, что строки в данных будут кодироваться как UTF-8.

конвертировать их в UTF-8, если они не являются уже:

$results = array_map(function($r) { 
    $r['text'] = utf8_encode($r['text']); 
    return $r; 
}, $results); 
echo json_encode($results); 
+0

теперь он печатается: [{"значение": "88", "текст": "\ u00eb \ u00e9 \ u00e \ u00e4 \ u00e0 '", "parent_id": "1", "level": "1"}, { "value": "89", "text": "\ u00eb \ u00e9 \ u00e4 \ u00e1 '", "parent_id": "1", "level": "1"}, {"value": "91 "," text ":" \ u00eb9 \ u00fa \ u00e4 \ u00e2 '"," parent_id ":" 1 "," level ":" 1 "}] - это то, как оно должно быть? им не хотелось видеть это как текст? –

+1

@ eric.itzhak Да, это действительно JSON. Если вы снова проанализируете его, экраны Unicode будут сопоставлены с соответствующими строками UTF-8. Если вы хотите, чтобы JSON не содержал эти экраны, установите параметр 'JSON_UNESCAPED_UNICODE' в' json_encode' (только php 5.4+). Обратите внимание, что экранирование Unicode позволяет вашему JSON проходить через 8-битные непрозрачные каналы (т. Е. Программы, которые неправильно обрабатывают кодировку). Вы теряете это при указании 'JSON_UNESCAPED_UNICODE'. – phihag

+0

Спасибо, фигаг! ты спасатель жизни :) –

0

Попробуйте json_encode($string, JSON_UNESCAPED_UNICODE); (только для PHP v5.4.0 + - см. docs).

+0

Если вы используете этот метод, вам нужно будет добавить заголовок в. [Как сохранить json_encode() для удаления строк с недопустимыми символами] (http: // stackoverflow.com/questions/4663743/how-to-keep-json-encode-from-dropping-strings-with-invalid-characters) 'header ('Content-Type: application/json; charset = utf-8');' – Wingman1487

1
$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") 
      ); 
0
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));

0

Одним из самых простых способов является установка запроса CHARSET для MySQL. Если вы хотите установить одну и ту же кодировку для всех своих запросов, просто добавьте следующее в конфигурационный файл или файл подключения к базе данных.

mysql_query('SET CHARACTER SET utf8'); 

Если вы просто хотите его на конкретные вопросы, а затем просто использовать это право до выполнения ваших запросов