Значения в UTF-8 кодируются как NULL в JSON

У меня есть набор ключевых слов, которые передаются через JSON из БД (закодированные UTF-8), некоторые из которых могут иметь специальные символы, такие как é, è, ç и т. Д. Это используется как часть автозаполнения. Пример:

array('Coffee', 'Cappuccino', 'Café');

Я должен добавить, что массив, полученный из БД, будет be:

array('Coffee', 'Cappuccino', 'Café');

Но JSON кодируется как:

["coffee", "cappuccino", null];

Если я напечатаю эти v ia print_r (), они отлично отображаются на веб-странице в кодировке UTF-8, но cafe отображается как "cafà ©", если используется text / plain, если я хочу посмотреть на массив с помощью print_r ($ array); exit () ;.

Если я кодирую с помощью utf8_encode () перед кодированием в JSON, все проходит нормально, но на веб-странице печатается «cafà ©», а не «cafe».

Также странно, но json_last_error () рассматривается как неопределенная функция, но json_decode () и json_encode () работают нормально.

Есть ли идеи, как заставить данные в кодировке UTF-8 из базы данных вести себя одинаково на протяжении всего процесса?

EIDT: Вот функция PHP, которая собирает ключевые слова и превращает их в единый массив:

private function get_keywords() 
{
    global $db, $json;

    $output = array();

    $db->query("SELECT keywords FROM listings");

    while ($r = $db->get_array())
    {
        $split = explode(",", $r['keywords']);

        foreach ($split as $s)
        {
            $s = trim($s);
            if ($s != "" && !in_array($s, $output)) $output[] = strtolower($s);
        }
    }

    $json->echo_json($output);
}

Метод json :: echo_json просто кодирует, устанавливает заголовок и печатает его (для использования с Prototype)

EDIT: Метод подключения к БД:

function connect()
{

    if ($this->set['sql_connect'])
    {
        $this->connection = @mysql_connect( $this->set['sql_host'], $this->set['sql_user'], $this->set['sql_pass'])
                OR $this->debug( "Connection Error", mysql_errno() .": ". mysql_error());
        $this->db = @mysql_select_db( $this->set['sql_name'], $this->connection)
                OR $this->debug( "Database Error", "Cannot Select Database '". $this->set['sql_name'] ."'");

        $this->is_connected = TRUE;
    }

    return TRUE;
}

Дополнительные обновления: Простой PHP-скрипт, который я запустил:

echo json_encode( array("Café") ); // ["Caf\u00e9"]
echo json_encode( array("Café") ); // null
9
задан mwieczorek 12 September 2010 в 10:24
поделиться