Проблемы с кодировкой UTF-8

303
09 октября 2017, 01:24

Всем привет! Столкнулся с проблемой, что при выгрузке данных из базы и конвертации их в json получаю ошибку "Malformed UTF-8 characters, possibly incorrectly encoded". Решил её следующей функцией:

public static function convert_from_latin1_to_utf8_recursively($data)
{
    if (is_string($data))
        return utf8_encode($data);
    if (!is_array($data))
        return $data;
    $patched_data = array();
    foreach ($data as $index => $value)
        $patched_data[$index] = self::convert_from_latin1_to_utf8_recursively($value);
    return $patched_data;
}

Но столкнулся со следующей проблемой, при показе данных они выглядят следующим образом:

На странице выставлено: <meta charset="utf-8">

Структура таблицы следующая:

Некоторые записи из базы:

Я не совсем понимаю, что не так, у меня есть подозрение, что данные, которые добавляются в базу, добавляются не в той кодировке. Данные добавляются пользователями, вручную.

Добавление происходит через эту функцию:

public static function create($project, $title, $type)
{
    $connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if (!$connection) {
        return false;
    }
    $query = "INSERT INTO reports(creation_date, project, title, creator, type, status, link) VALUES ("
        . mysqli_real_escape_string($connection, 'now()') . ", "
        . "'" . mysqli_real_escape_string($connection, $project) . "'" . ", "
        . "'" . mysqli_real_escape_string($connection, $title) . "'" . ", "
        . "'" . mysqli_real_escape_string($connection, Auth::get_user_id()) . "'" . ", "
        . "'" . mysqli_real_escape_string($connection, $type) . "'" . ", "
        . "'" . mysqli_real_escape_string($connection, 'preparation') . "'" . ", "
        . mysqli_real_escape_string($connection, 'NULL')
        . ")";
    $result = mysqli_query($connection, $query) ? mysqli_insert_id($connection) : false;
    mysqli_close($connection);
    return $result;
}

Забираются данные через эту функцию:

public static function get()
{
    $connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if (!$connection) {
        return json_encode(array());
    }
    $query = "SELECT * FROM reports";
    $result = mysqli_query($connection, $query);
    $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_close($connection);
    return json_encode($data);
}

От себя хочу добавить, что в PHP я новичок и для меня это не слишком тривиальная задача. Если будут замечания по коду - пишите, выслушаю ваши предложения.

Обновление #1

После выставления кодировки соединению, с помощью $connection->set_charset('utf8');, проблема с json "Malformed UTF-8 characters, possibly incorrectly encoded" была устранена и была удалена функция convert_from_latin1_to_utf8_recursively так как стала ненужной. Но символы на странице остались в таком же формате.

READ ALSO
HTML DOM Parser возвращает False

HTML DOM Parser возвращает False

Использую библиотеку

302
Преобразование строки в выражение

Преобразование строки в выражение

Как преобразовать строку в выражение?

266
Как из формы брать данные для FindOne Yii2

Как из формы брать данные для FindOne Yii2

вот контроллер, как из формы взять id который будет в FindOne() на подобии FindOne($model->id)

322