xmliconv:解決 Yahoo Pipes 中文編碼問題
2007 年 六月 13 日 (星期三) 4:19 pm分類:電腦
標籤: encoding, yahoo_pipes
Yahoo Pipes 是個極富創意的服務,將客製化權力下放給不會寫程式的普羅大眾,又擁有相當直觀的隱喻及某種程度的彈性,是 Web 2.0 時代 mashup DIY 工具的典範。
可惜它的服務品質不夠穩定(因為不是 Google 出品?),容錯能力也有待改進。一般情況下這些缺失是可以容忍的,畢竟目前只此一家別無分號;但身處中文世界的我們,卻常常遇到難以容忍的中文亂碼問題,害我有個衝動想自己寫個 Yahoo Pipes 精簡版 ── 我的確動手寫了,也完成了 60%,但昨天臨時決定暫且擱置,反問自己:問題的本質是什麼?有沒有更簡單、不必大費周章另起爐灶的方法,就能解決我所在意的問題?
好好地陳述問題,問題就等於解決了一半。 ── 俗 語
愚蠢的問題,得到愚蠢的答案,那是報應。 ── Milton Friedman
於是我先進行一串簡單的實驗,設法釐清問題所在。首先看看聯合新聞網在 Yahoo Pipes 上會有什麼狀況發生吧。聯合新聞網提供許多 RSS 頻道供你訂閱,像「udn文教綜合」這個頻道,你用 Firefox、Netvibes、推推王去訂閱,看起來都很正常:
![]()
可是如果你把它餵給 Yahoo Pipes,就算沒有施以任何加工處理,只是原原本本餵進去再吐出來,中文也會亂成一團:
![]()
兩相對照,會更清楚看出 Yahoo Pipes 對於 RSS 資料流會造成什麼不良影響:
![]()
詭異的是,Yahoo Pipes 對 CNET 的中文資料卻不會弄亂,而且 CNET 的 RSS 還是用理論上問題應該比較多的 big5 碼呢:
![]()
難不成 Yahoo Pipes 對中文有差別待遇,喜歡 big5,討厭 utf-8?
我懷疑這可能是因為 Yahoo Pipes 對某些 RSS 頻道容錯能力不夠,或者說:猜測/重建編碼的能力不夠。於是,我打算仔細看看「udn文教綜合」這個頻道的原始內容究竟藏著什麼玄機:
![]()
從綠色框框標記起來的地方可以發現,雖然產生的 XML 檔案的確有標上「encoding="UTF-8"」編碼設定,但是在 HTTP header 的「Content-Type:」卻沒有標明,導致笨笨的 Yahoo Pipes 無法正確辨識緊隨在後的 XML 內容。
反觀「CNET台灣 - 最新20則新聞」頻道,雖然是用 big5 編碼:
![]()
可是它在 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 卯起來寫的「黑米關鍵字雷達」和「黑米個人雷達」……運用之妙,存乎一心。


追蹤留言回應:以
引用通告 (trackback):![[add to funP]](http://william.cswiz.org/blog/wp-content/themes/william/images/add-funp.png)
![[add to HEMiDEMi]](http://www.hemidemi.com/sticker/user/roxytom.bluecircus.net.gif)
![[add to udn bookmark]](http://bookmark.udn.com/html/help/80_20_02.gif)

2007 年 六月 14日 於 10:04 am
我也遇到類似的事情… FeedRinse 或 Feedshake 都對中文處理很有問題,我就自制了個 web service 去處理 Feed 了… http://www.feedfilter.net/
2007 年 六月 14日 於 11:47 am
還有個更簡單的做法:即然問題的來源是 udn 的設定錯誤,那麼就寄 email、打電話、留言叫他們修好就行了. 不過會比較快還是比較慢就很難講了. 自己動手做轉換器的好處就是不求人,下次再碰到這種 rss 時可以輕鬆解決.
2007 年 六月 14日 於 12:56 pm
不指定 encoding 也沒 BOM 的 XML檔,
預設就是 UTF-8…
這點只能說 yahoo 沒做好.
不過話說回來,
web traffic 會出現的編碼問題,
其實責任多半都出在 web server 無法回送編碼方式…
2007 年 六月 14日 於 3:23 pm
@小影:
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,就搞定了。
2007 年 六月 14日 於 5:45 pm
我做了一個xmliconv的pipe,在文字框裡輸入欲轉換的RSS網址,就可以變成Yahoo Pipes可以吃的RSS。其實就是幫忙加上前面那一段網址啦。
http://pipes.yahoo.com/pipes/pipe.info?_id=aAn_BhMa3BGjrVnAJhOy0Q
2007 年 六月 14日 於 9:07 pm
要在只有支援 big5 的 mobile devices 上看 utf-8 的網頁,可以參考我這篇《用 TH-55 看 bloglines》。
2007 年 六月 15日 於 11:47 am
我用FeedBurner實驗結果是no,
用您的轉換器就ok了,感恩喲~
2007 年 六月 20日 於 9:00 pm
您好,
我用http://www.dynamicdrive.com/dynamicindex17/rsspausescroller/index.htm
網站上面的這個rss gather (js/ajax)
在我的wordpress網站連結台灣的中文rss郤出現亂碼
我的網站(右欄的第一順位)
http://maubau.blogdns.net/
請william兄解感一番
jim
2007 年 六月 20日 於 9:50 pm
@jim:
你用的這個 Pausing RSS scroller,它本身的 PHP 並沒有處理 RSS 編碼問題,更別提它的 js 了。
你不妨考慮改用其他台灣用戶常用的聯播程式。
2007 年 六月 21日 於 6:16 pm
感謝
2007 年 十一月 3日 於 4:02 am
[web20] pipes 心得?
找了些文章,大致上和我猜想的原因差不多
原來是feed的xml文件,encoding和Content-Type的標明不夠完整
加上yahoo pipes尚未有此容錯功能,導致產生了亂碼
網路上就有人寫了個轉換器,此需在網址之前再加上一網址,即會幫你加入不足的標示
詳見該網址~ [...]
2008 年 三月 6日 於 7:25 pm
Thank you for your Great service!
I can use pipes with encoding.