Как избавиться от странных персонажей в моей ленте RSS? - PullRequest
3 голосов
/ 12 декабря 2008

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

Вот мой код RSS-канала (CFML):

<cfsilent>
<!--- Get News --->
<cfinvoke component="com.news" method="getAll" dsn="#Request.App.dsn#"     returnvariable="news" />
</cfsilent>
<!--- If we have news items --->
cfif news.RecordCount GT 0>
<!--- Serve RSS content-type --->
<cfcontent type="application/rss+xml">
<!--- Output feed --->
<cfcontent reset="true"><?xml version="1.0" encoding="utf-8"?>
<cfoutput>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>News RSS Feed</title>
        <link>#Application.siteRoot#</link>
        <description>Welcome to the News RSS Feed</description>
        <lastBuildDate>Wed, 19 Nov 2008 09:05:00 GMT</lastBuildDate>
        <language>en-uk</language>
        <atom:link href="#Application.siteRoot#news/rss/index.cfm" rel="self" type="application/rss+xml" />

    <cfloop query="news">
    <!--- Make data xml compliant --->
        <cfscript>
        news.headline = replace(news.headline, "<", "&lt;", "ALL");
        news.body = replace(news.body, "<", "&lt;", "ALL");
        news.date = dateformat(news.date, "ddd, dd mmm yyyy");
        news.time = timeformat(news.time, "HH:mm:ss") & " GMT"; 
        </cfscript>        
    <item>
        <title>#news.headline#</title>
        <link>#Application.siteRoot#news/index.cfm?id=#news.id#</link>
        <guid>#Application.siteRoot#news/index.cfm?id=#news.id#</guid>
        <pubDate>#news.date# #news.time#</pubDate>
        <description>#news.body#</description>
    </item>
    </cfloop>
    </channel>
</rss>
</cfoutput>
<cfelse>
<!--- If we have no news items, relocate to news page --->
<cflocation url="../news/index.cfm" addtoken="no">
</cfif> 

Есть ли у кого-нибудь предложения? Я провел множество исследований, но не могу найти ответы: (

Заранее спасибо,

Chromis

Ответы [ 5 ]

6 голосов
/ 12 декабря 2008

Избавьтесь от экранирующего кода и используйте вместо него XMLFormat:

<item>
    <title>#XMLFormat(news.headline)#</title>
    <link>#Application.siteRoot#news/index.cfm?id=#XMLFormat(news.id)#</link>
    <guid>#Application.siteRoot#news/index.cfm?id=#XMLFormat(news.id)#</guid>
    <pubDate>#XMLFormat(news.date)# #XMLFormat(news.time)#</pubDate>
    <description>#XMLFormat(news.body)#</description>
</item>

Просмотр страницы XMLFormat liveoc.

1 голос
/ 19 июля 2012

Это сработало для меня, просто объединить в один тег cfcontent и добавить charset = utf-8. <cfcontent type="text/xml; charset=utf-8" reset="yes" />

0 голосов
/ 23 июля 2012

Если вы используете Adobe ColdFusion 9 или выше, рассмотрите возможность использования CFFEED с атрибутом escapeChars для создания RSS (CF8 также поддерживает CFFEED, но не этот атрибут).

http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7675.html

0 голосов
/ 15 декабря 2008

Обеззараживать каждый ввод, когда он вводится в базу данных, таким образом, это должно упростить отображение таких данных впоследствии.

0 голосов
/ 12 декабря 2008

Ваша экранирующая функция слишком проста. Сначала вам нужно изменить & на &amp;.

Если вы используете именованные объекты (т.е. &pound;), это является причиной ошибки.

...