Как исправить кракозябры вместо кириллических символов?

Значения из базы данных, которые в кириллице приходят в виде кракозябр. Т.е. в базе указано "Примечание", а в результате приходит "Ïðèìå÷àíèå". Если значение на латинице, то всё приходит корректно. Как исправить?
<head>
<meta charset="utf-8">
</head>
<body>
<div class="test">
    <span class="id_remains" data-id_remain="AA001">Айди остатка</span>
    <input type="text" id="edit_note">
    <button class="edit">Редактировать</button>
</div>
<script>
$(document).on("click", '.edit', function(){
    var id_remains = $(this).parent().find('.id_remains').data('id_remains');

    $.ajax({
        type: 'POST',
        url: 'controller/edit_row.php',
        data: {id_remains: id_remains},
        dataType: 'json',
        success: function(response) {
            $('#edit_note').val(response.note);
            console.log(response.note);
        }
    });
});
<script>
</body>

edit_row.php
<?php
// Подключаемся к базе данных
$pdo = new PDO('mysql:host=localhost;dbname=name;charset=utf8', 'user', 'pass');

// Получаем значение id_remains из POST-запроса
$id_remains = $_POST['id_remains'];

// Выполняем запрос к базе данных для получения значения width
$stmt = $pdo->prepare('SELECT note FROM ldsp WHERE id_remains = :id_remains');
$stmt->execute([':id_remains' => $id_remains]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

// Возвращаем значение width в виде JSON-объекта
echo json_encode([
    'note' => utf8_encode($row['note'])
]);

Результат SHOW VARIABLES LIKE 'character_set%';
character_set_client utf8mb4
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8mb4
character_set_server cp1251
character_set_system utf8
character_sets_dir /usr/share/percona-server/charsets
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
У вас в этой таблице лежат данные, закодированные в windows-1251.
Вам надо или перекодировать полученные данные нормально, через mb_convert_encoding(), а не вот это вот недоразумение utf8_encode.

Или лучше всего один раз и навсегда перекодировать данные в БД.
Для этого надо сделать дамп, поменять в нем set names с utf8 на cp1251, и выполнить сначала на тестовой БД
Если данные будут читаться, то выполнить на боевой.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Посмотрите в отладчике браузера (вкладка Сеть), какие заголовки возвращаются с ответом сервера.
Если там заголовок с кодировкой отличен от utf-8, то сервер по умолчанию ее не использует.
Либо нужно php.ini исправлять, либо в скрипте отдавать нужный заголовок:
header('Content-Type: text/html; charset=utf-8');
То, что вы в HTML указали:
<meta charset="utf-8">
Не дает никаких указаний серверу, в какой кодировке отдавать ответ.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы