Вопрос или проблема
Я пытаюсь сделать вызов fetch
, чтобы получить список городов из БД для размещения в тегах <option>
в выпадающем списке. Однако, когда город "César Chávez"
включен в результаты, это нарушает ответ.
Вышеупомянутое — это то, как этот город хранится в БД с использованием utf8mb4_unicode_ci
, и я могу напечатать результаты с отображением акцентов, но не могу получить доступ к этому в ответе.
Я искал похожие вопросы, но многие из них без ответов, а те, что имеют ответы, я пытался реализовать, добавив заголовок contentType
для текста utf-8, используя htmlentities
(который просто игнорирует это)
htmlentities(utf8_encode($city), 0, "UTF-8")]
А также добавив параметры к json_encode
на стороне сервера:
JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE
Иногда я хотя бы вижу результат в ответе в консоли разработчика, но HTML-символы мешают отображению в параметрах выпадающего списка.
Кажется, это не должно быть трудно, но я в замешательстве. Буду признателен за любую помощь!
ИСПРАВЛЕНИЕ:
Обычно я получаю ошибку: “Uncaught (in promise) SyntaxError: JSON.parse: неожиданный конец данных в строке 1, столбец 1 данных JSON”.
Вот почему я пытался манипулировать на стороне сервера.
Часть ответа fetch выглядит следующим образом
if(data.arr){
for(let i=0; i<data.arr.length; i++){
const town = data.arr[i][1];
html += "<option data-id=" + data.arr[i][0] + " value="" + town + "">";
}
}
Я пробовал town = encodeURIComponent(data.arr[i][1]), но безуспешно.
Ответ или решение
Чтобы корректно получить ответ от API с акцентированными символами, такими как "César Chávez", вам нужно убедиться, что данные обрабатываются правильно как на стороне сервера, так и на стороне клиента. Рассмотрим основные шаги, которые помогут вам решить вашу проблему:
-
Проверьте кодировку базы данных:
Убедитесь, что ваша база данных использует кодировкуutf8mb4
, которая поддерживает все символы UTF-8, включая акцентированные. Это можно сделать с помощью следующей команды SQL:SHOW VARIABLES LIKE 'character_set_database';
Если у вас стоит не
utf8mb4
, вы можете изменить кодировку базы данных и таблиц:ALTER DATABASE имя_базы CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE имя_таблицы CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
Настройте PHP для работы с JSON:
При кодировании массива в JSON на стороне сервера используйтеjson_encode
с параметромJSON_UNESCAPED_UNICODE
, чтобы избежать экранирования акцентированных символов. Ваш код будет выглядеть так:echo json_encode($data, JSON_UNESCAPED_UNICODE);
-
Проверьте заголовки ответа:
Убедитесь, что сервер отправляет правильный заголовокContent-Type
, указывая, что данные передаются в формате JSON и используют кодировку UTF-8:header('Content-Type: application/json; charset=UTF-8');
-
Обработка данных на стороне клиента:
В вашем JavaScript-коде убедитесь, что вы правильно обрабатываете ответ. Например, вы можете использовать следующий код для создания вашего выпадающего списка:fetch('ваш_api_эндпоинт') .then(response => { if (!response.ok) { throw new Error('Сетевой ответ не был корректным'); } return response.json(); }) .then(data => { let html = ''; if (data.arr) { for (let i = 0; i < data.arr.length; i++) { const town = data.arr[i][1]; html += `<option data-id="${data.arr[i][0]}" value="${town}">${town}</option>`; } } // Добавьте html в ваш элемент select, например: document.getElementById('ваш_select_id').innerHTML = html; }) .catch(error => { console.error('Ошибка при получении данных:', error); });
-
Использование
encodeURIComponent
при необходимости:
Если вы хотите дополнительно закодировать значниеtown
, используйтеencodeURIComponent
, однако в большинстве случаев это не требуется, пока данные уже обрабатываются корректно на стороне сервера.
Соблюдение этих шагов должно помочь вам решить проблему с акцентированными символами и корректно отобразить их в вашем выпадающем списке.