проблема с RSS-каналом и CDATA - PullRequest
3 голосов
/ 04 мая 2009

У меня проблема с RSS-каналом.

Когда я делаю <title>This is a title </title>

Заголовок красиво отображается в ленте

Но когда я буду $ 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

Более подробная информация:

Хорошо, я боролся с этим последние несколько дней, и я не могу найти решение. Так что я начну щедрость. Вот больше информации:

  • Информация, которая идет в ленте, хранится в базе данных латиницы 1 (которую я администрирую)
  • Проблема возникает при наличии знака евро в базе данных. Неважно, будет ли это как € или &euro;
  • Знак евро иногда выглядит как странные символы или как \ x80
  • Я пытаюсь решить проблему на стороне подачи, а не на стороне читателя.
  • Полный код можно найти здесь: codedump
  • Далее: иногда, когда знак евро невозможно проанализировать, элемент (заголовок или описание) отображается пустым. Поэтому, если вы посмотрите на источник при отображении канала в браузере, вы найдете <title></title>

Если вам нужна дополнительная информация, пожалуйста, спросите.

Ответы [ 6 ]

15 голосов
/ 04 мая 2009

Проблема в том, что вы выводите код; изменить

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 по умолчанию, и нет способа выразить, например, знак евро в этой кодировке. Для получения дополнительной информации, пожалуйста, обратитесь к этому <a href="http://www.joelonsoftware.com/articles/Unicode.html" rel="noreferrer"> хорошо написанному введению .

Я также предлагаю вам прочитать о XML . Начните со второй главы.

3 голосов
/ 13 мая 2009

Используйте htmlspecialchars() вместо htmlentities().

Ленты RSS / ATOM не HTML, поэтому вы не можете использовать в них объекты HTML. XML имеет только пять сущностей, определенных по умолчанию , поэтому вы не можете использовать &euro;. Поскольку вы используете UTF - используйте буквальный знак евро, без преобразования (без htmlentities), но с экранированием других чувствительных символов (htmlspecialchars).

И это будет полностью действительный RSS / XML. Если это не решает проблему, значит, она лежит где-то еще (пожалуйста, предоставьте мне сгенерированный необработанный источник RSS для получения дополнительной помощи).

1 голос
/ 04 мая 2009

Какой язык программирования или среду вы используете? Например, в PHP одинарные кавычки не позволяют оценить переменные внутри.

В противном случае, в этом случае вам не нужны эти кавычки. Может быть, вас смутил синтаксис массива PHP.

Так что вам лучше написать:

<title><![CDATA[$title]]></title>
0 голосов
/ 07 сентября 2011

Я не понимаю, почему вы должны использовать функцию кодирования. Когда третьи лица получат ваш контент, у вас не будет представления о том, как декодировать эту строку. я думаю что - вы должны использовать CDATA для тегов, которые могут нарушить XML использовать четко определенные библиотеки для написания XML. Для PHP: DomDocument или XML Writer (http://php.net/manual/en/book.xmlwriter.php)

0 голосов
/ 09 мая 2009

Эта статья может быть полезна для получения информации о знаке евро и поддержки в различных контекстах. Некоторые из предложений из этой статьи включают использование &#8364; или &euro; или просто замену знака словом «евро». Удачи!

0 голосов
/ 04 мая 2009

Я полагаю, что профиль RSS не допускает этого: этот документ гласит, что title содержит символьные данные, которые далее определяются следующим образом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...