У меня есть script, который кэширует несколько RSS-каналов, однако я заметил, что начал получать странные символы, появляющиеся на странице, где я вывожу содержимое в кеш-памяти (хранится в БД).
Например, RSS-канал содержит символы: Introducing…: ...
Что следует читать: Introducing...: ...
Однако моя страница отображает это как: Introducing…: ...
Кажется, что эти незнакомые символы фактически хранятся в базе данных, как это.
Может кто подскажет, где я могу ошибиться?
Нужно ли кодировать на пути в базу данных декодирование на выходе?
Вам нужно убедиться, что кодировка RSS-канала такая же, как в вашей БД. В противном случае вам сначала нужно преобразовать содержимое.
Кодирование фида должно быть в заголовке XML:
<?xml version="1.0" encoding="UTF-8"?>
Вы можете использовать эту функцию для преобразования ее в кодировку, используемую вами в БД (предпочтительно UTF-8):
Когда вы используете UTF-8, убедитесь, что вы установили соединение с базой данных с utf-8.. f.e. в mysql
SET NAMES 'utf-8';
Затем установите правильный выходной контент-тип, как описано Энтони Уильямсом. В лучшем случае вы оба: установите META Content-Type и отправьте HTTP-заголовок Content-Type.
Поскольку ваше приложение, по-видимому, расшифровывает htmlentities этого кэшированного RSS-канала перед тем, как записывать их в БД, вы также можете выводить их, как вы их получили в первую очередь
<?php echo htmlentities($string, ENT_QUOTES, 'UTF-8'); ?>
Тот факт, что на выходе есть 3 плохих символа, предполагает, что RSS-канал интерпретируется так, что ссылка на символ HTML преобразуется в UTF-8.
Попробуйте настроить текстовое кодирование вашей страницы отображения на UTF-8, добавив следующее в выходной HTML в разделе <head>
:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
В качестве альтернативы, поскольку это PHP, вы можете напрямую настроить HTTP-заголовок:
<?php
header("Content-Type: text/html; charset=UTF-8");
?>
Тем не менее, лучшим решением может быть отказ от преобразования объекта в первую очередь. Получили ли вы вызов html_entity_decode()
в коде, который извлекает RSS-канал? Если это так, тогда было бы разумно удалить его.