Вопрос
У меня проблема с rss-каналом.
Когда я делаю <title>This is a title </title>
Заголовок красиво отображается в ленте
Но когда я делаю ddo $title = "это тильт";
<title><![CDATA['$title']]></title>
Заголовок вообще не появляется.
Это все еще не работает.Я генерирую свой rss-канал динамично, и он выглядит примерно так:
$item_template="
<item>
<title>[[title]]</title>
<link>[[link]]</link>
<description><![CDATA[[[description]]]]></description>
<pubDate>[[date]]</pubDate>
</item>
";
и в цикле:
$s.=str_replace(
array("[[title]]","[[link]]","[[description]]","[[date]]"),
array(htmlentities($row["title"]),$url,$description,$date),
$item_template);
Проблема, в частности, в том, что в названии есть знак евро.Затем он отображается в моем rss-валидаторе следующим образом:
Â\x80
Более подробная информация:
Хорошо, я боролся с этим в течение последних нескольких дней, и я не могу найти решение.Так что я начну розыгрыш награды.Вот более подробная информация:
- Информация, которая попадает в ленту, хранится в базе данных latin 1 (которой я администрирую).
- Проблема возникает, когда в базе данных есть знак евро.Независимо от того, нравится ли это € или
€
- Знак евро иногда выглядит как странные символы или как Â \ x80
- Я пытаюсь решить проблему на стороне канала, а не на стороне читателя.
- Полный код можно найти здесь: codedump кодовый дамп
- Далее:иногда, когда знак евро не может быть проанализирован, элемент (либо заголовок, либо описание) отображается пустым.Итак, если вы заглянете в исходный код при показе ленты в браузере, вы найдете
<title></title>
Если вам нужна дополнительная информация, пожалуйста, спрашивайте.
Решение
Проблема в вашем выводимом коде;изменение
echo '<title><![CDATA[$title]]></title>';
Для
echo '<title><![CDATA[' . $title . ']]></title>';
В качестве дополнительного примечания, пожалуйста, обратите внимание на следующее:Не отвечайте на свой собственный вопрос с последующим дополнением, а отредактируйте исходный.Не используйте регулярные выражения без уважительной причины.Не надо гадать.
Вместо этого сделайте то, что вы должны были делать с самого начала:Оберните заголовок в htmlentitites
и будет сделано, как в:
echo '<title>' . htmlentities($title, ENT_NOQUOTES, [encoding]) . '</title>';
Заменить [encoding]
с той кодировкой символов, которую вы используете. Скорее всего, это 'UTF-8'.Это необходимо, потому что php(<6) по умолчанию используется ISO-8859-1, и нет способа выразить, напримерзнак евро в этой кодировке.Для получения дополнительной информации, пожалуйста, обратитесь к этому хорошо написанное введение.
Я также предлагаю вам читайте о XML.Начните со второй главы.
Другие советы
Использование htmlspecialchars()
вместо того , чтобы htmlentities()
.
Каналы RSS /ATOM не являются HTML, поэтому вы не можете использовать в них HTML-объекты. XML содержит только пять объектов, определенных по умолчанию, так что вы не можете использовать €
.Поскольку вы используете UTF — используйте буквальный знак евро, без преобразования (нет htmlentities
), но с экранированием других чувствительных символов (htmlspecialchars
).
И это было бы полностью допустимым RSS / XML.Если это не решает проблему, это означает, что она лежит где-то в другом месте (пожалуйста, предоставьте мне сгенерированный исходный код RSS для получения дополнительной помощи).
Какой язык программирования или среду вы используете?Например, в PHP одинарные кавычки препятствуют вычислению переменных внутри.
В противном случае, в данном случае вам на самом деле не нужны эти цитаты.Возможно, вас смутил синтаксис массива в PHP.
Так что вам лучше написать:
<title><![CDATA[$title]]></title>
Я не понимаю, почему вы должны использовать функцию кодирования.Когда третья сторона возьмет ваш контент, вы не будете иметь ни малейшего представления о том, как расшифровать эту строку.Я думаю, что - вам следует использовать CDATA для тегов, которые могут нарушать работу с XML - используйте четко определенные библиотеки для записи XML.Для PHP:DOMDocument или средство записи XML (http://php.net/manual/en/book.xmlwriter.php)
Я считаю, что профиль RSS не позволяет этого: это в документе говорится, что title
удерживает символьные данные, которые дополнительно определяются следующим образом.
Эта статья может быть полезно получить информацию о знаке евро и поддержке в различных контекстах.Некоторые из предложений из этой статьи включают использование €
или €
или просто замените знак словом "евро". Удачи!