xmliconv:解決 Yahoo Pipes 中文編碼問題

2007 年 六月 13 日 (星期三) 4:19 pm
分類:電腦
標籤:,

Yahoo Pipes 是個極富創意的服務,將客製化權力下放給不會寫程式的普羅大眾,又擁有相當直觀的隱喻及某種程度的彈性,是 Web 2.0 時代 mashup DIY 工具的典範。

可惜它的服務品質不夠穩定(因為不是 Google 出品?),容錯能力也有待改進。一般情況下這些缺失是可以容忍的,畢竟目前只此一家別無分號;但身處中文世界的我們,卻常常遇到難以容忍的中文亂碼問題,害我有個衝動想自己寫個 Yahoo Pipes 精簡版 ── 我的確動手寫了,也完成了 60%,但昨天臨時決定暫且擱置,反問自己:問題的本質是什麼?有沒有更簡單、不必大費周章另起爐灶的方法,就能解決我所在意的問題?

好好地陳述問題,問題就等於解決了一半。 ── 俗 語
愚蠢的問題,得到愚蠢的答案,那是報應。 ── Milton Friedman

於是我先進行一串簡單的實驗,設法釐清問題所在。首先看看聯合新聞網在 Yahoo Pipes 上會有什麼狀況發生吧。聯合新聞網提供許多 RSS 頻道供你訂閱,像「udn文教綜合」這個頻道,你用 FirefoxNetvibes推推王去訂閱,看起來都很正常:

udnnews in RSS readers

可是如果你把它餵給 Yahoo Pipes,就算沒有施以任何加工處理,只是原原本本餵進去再吐出來,中文也會亂成一團:

udnnews in Yahoo Pipes

兩相對照,會更清楚看出 Yahoo Pipes 對於 RSS 資料流會造成什麼不良影響:

udnnews in Yahoo Pipes

詭異的是,Yahoo Pipes 對 CNET 的中文資料卻不會弄亂,而且 CNET 的 RSS 還是用理論上問題應該比較多的 big5 碼呢:

cnet in Yahoo Pipes

難不成 Yahoo Pipes 對中文有差別待遇,喜歡 big5,討厭 utf-8?

我懷疑這可能是因為 Yahoo Pipes 對某些 RSS 頻道容錯能力不夠,或者說:猜測/重建編碼的能力不夠。於是,我打算仔細看看「udn文教綜合」這個頻道的原始內容究竟藏著什麼玄機:

udnnews buggy HTTP headers

從綠色框框標記起來的地方可以發現,雖然產生的 XML 檔案的確有標上「encoding="UTF-8"」編碼設定,但是在 HTTP header 的「Content-Type:」卻沒有標明,導致笨笨的 Yahoo Pipes 無法正確辨識緊隨在後的 XML 內容。

反觀「CNET台灣 - 最新20則新聞」頻道,雖然是用 big5 編碼:

cnet HTTP headers

可是它在 HTTP header 及 XML 檔頭都有標上編碼代號,讓 Yahoo Pipes 得以正確解析。

所以結論很簡單:只要在將 RSS 餵給 Yahoo Pipes 之前,先設法把上述兩個編碼設定修補好,就可以讓笨笨的 Yahoo Pipes 正確處理中文。

問題是:該怎麼修補?

我在堯@部落格看到一個很有創意的做法。〈自己動手做輪播 - 使用 Yahoo! Pipes〉文中提到,以 FeedBurner 為中介,可修整一些 RSS 的日期格式問題。我用 FeedBurner 也很久了,以前都只是用來減輕主機負荷,但這篇文章給了我一個靈感:把 RSS 丟給 FeedBurner 去燒一燒,會不會順便就把那兩個編碼設定問題給修補好?畢竟 FeedBurner 的容錯能力是一流的。

實驗結果是 Yes。

理論上可行,但實際應用起來很不方便。試想:萬一有 100 個頻道要修補,難不成我要在 FeedBurner 裡面設定一百次?別忘了,還要再把這堆經過 FeedBurner 燒過的 100 個頻道填入 Yahoo Pipes 裡面……

經過這番分析,我的目標就很明確了:我要設計一個即時修補以上兩個編碼設定問題的轉換器,而且是隨傳隨到隨修,不需經過冗長繁瑣又重複的 GUI 設定步驟。

這個 xmliconv 轉換器使用起來很簡單,只要將有上述編碼問題的 RSS 網址串在此轉換器的後面:

  • http://william.cswiz.org/tool/xmliconv/?url=待轉換的rss網址

你就會收到編碼正常的 RSS 輸出。譬如說,原本要餵給 Yahoo Pipes 的「udn文教綜合」頻道,現在可以改成:

  • http://william.cswiz.org/tool/xmliconv/?url=http://udn.com/udnrss/education.xml

正常情況下,這個轉換器會試著猜測你餵給它的 RSS 編碼為何,不過萬一它笨笨的猜錯了,你也可以給點提示:

  • http://william.cswiz.org/tool/xmliconv/?ie=utf-8
    &url=http://udn.com/udnrss/education.xml
  • http://william.cswiz.org/tool/xmliconv/?ie=big5
    &url=http://www.taiwan.cnet.com/rss/latest_news.htm

如此一來,你可以花最少的力氣,就享受 Yahoo Pipes 帶給你的好處,讓 Yahoo Pipes 不會在中文世界中缺席。譬如說,我在〈推推王與 Yahoo Pipes 的結合〉文中介紹過的「頻道合併」效果,法茲提克製作的〈Yahoo Pipes 應用:依版分類,一 Feed 看盡台灣報紙〉,或者最近 Qing 卯起來寫的「黑米關鍵字雷達」和「黑米個人雷達」……運用之妙,存乎一心。


◤建議您一併閱讀以下文章:

12 項留言回應 給 “xmliconv:解決 Yahoo Pipes 中文編碼問題”

  1. 1 小影 留言:

    我也遇到類似的事情… FeedRinse 或 Feedshake 都對中文處理很有問題,我就自制了個 web service 去處理 Feed 了… http://www.feedfilter.net/

  2. 2 av 留言:

    還有個更簡單的做法:即然問題的來源是 udn 的設定錯誤,那麼就寄 email、打電話、留言叫他們修好就行了. 不過會比較快還是比較慢就很難講了. 自己動手做轉換器的好處就是不求人,下次再碰到這種 rss 時可以輕鬆解決.

  3. 3 Lu, Jye 留言:

    不指定 encoding 也沒 BOM 的 XML檔,
    預設就是 UTF-8…
    這點只能說 yahoo 沒做好.

    不過話說回來,
    web traffic 會出現的編碼問題,
    其實責任多半都出在 web server 無法回送編碼方式…

  4. 4 william 留言:

    @小影:
    Good job!

    @AV:

    udn 的設定,其實也不能算是 error 的程度,充其量只能算是 warning。因為正如 3 樓所講,在 XML 世界裡,default 本來就是 utf-8。此外,<?xml encoding=… ?> 的設定,priority 應該是大於 HTTP header 的設定。

    更何況 xmliconv 也只是我大構想的一部份,做出來之後,當成一個 preprocessor 或 pipe,很容易串接其他服務。舉個簡單的例子:某些系統對於非 utf-8 的 XML 輸入非常感冒(像 PHP PEAR 的 XML_Feed_Parser、Resin Quercus 都無法處理 big-5 的 XML),這時候,只要串接一下 xmliconv,就搞定了。

  5. 5 fauzty 留言:

    我做了一個xmliconv的pipe,在文字框裡輸入欲轉換的RSS網址,就可以變成Yahoo Pipes可以吃的RSS。其實就是幫忙加上前面那一段網址啦。

    http://pipes.yahoo.com/pipes/pipe.info?_id=aAn_BhMa3BGjrVnAJhOy0Q

  6. 6 jeffhung 留言:

    要在只有支援 big5 的 mobile devices 上看 utf-8 的網頁,可以參考我這篇《用 TH-55 看 bloglines》。

  7. 7 lionel 留言:

    我用FeedBurner實驗結果是no,
    用您的轉換器就ok了,感恩喲~

  8. 8 jim 留言:

    您好,

    我用http://www.dynamicdrive.com/dynamicindex17/rsspausescroller/index.htm
    網站上面的這個rss gather (js/ajax)
    在我的wordpress網站連結台灣的中文rss郤出現亂碼
    我的網站(右欄的第一順位)
    http://maubau.blogdns.net/

    請william兄解感一番
    jim

  9. 9 william 留言:

    @jim:

    你用的這個 Pausing RSS scroller,它本身的 PHP 並沒有處理 RSS 編碼問題,更別提它的 js 了。

    你不妨考慮改用其他台灣用戶常用的聯播程式。

  10. 10 jim 留言:

    感謝

  11. 11 [web20] pipes 心得? 引用:

    [web20] pipes 心得?

    找了些文章,大致上和我猜想的原因差不多
    原來是feed的xml文件,encoding和Content-Type的標明不夠完整
    加上yahoo pipes尚未有此容錯功能,導致產生了亂碼
    網路上就有人寫了個轉換器,此需在網址之前再加上一網址,即會幫你加入不足的標示
    詳見該網址~ [...]

  12. 12 sanemat 留言:

    Thank you for your Great service!
    I can use pipes with encoding.

留言回應

[檢核碼]  


Allowed XHTML tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

本站已啟用 spam 防護機制。為避免系統誤判,請在按下按鈕之前,先備份您的留言,以防不測。如果您一直無法順利留言,請改用 email 方式。
此外,如果您想留的言與本篇文章及討論串無關,也請轉而點選這裡。謝謝您!