PalmIsLife阿輝在這篇《[交流] RSS Web Host 很適合在 PDA 上瀏覽》介紹了如何使用他的 Treo 650Bloglines,我才知道,原來 Bloglines 有提供 mobile 版本,如果搭配 data stream 吃到飽的 3G 門號的話,非常地吸引人。 所以我就提了兩個問題如下:

  1. 我直接用 TH-55 連上 Bloglines,畫面仍然是分 <frame> 的,並沒有出現適合 PDA 閱讀的畫面版本。請問阿輝是直接連就可以了嗎?還是用 PDA 專用的 Bloglines 網址?我的 TH-55 的瀏覽器是 NetFront v3.1 r2.0.26 (en)。
  2. 大多數的 Blog 以及 Bloglines 的網頁皆是採用 UTF-8 編碼。請問阿輝的 PDA 畫面能夠正常顯示中文,是因為有裝「Unicode 補完計畫」的關係嗎?還是用了其他特殊的技巧?

阿輝的解答是,對於第一個問題,他直接上就可以了,所以 Bloglines 沒辦法偵測我用的 NetFront v3.1,自動切換成 mobile 模式。不過還好 cooltony 給了我這個網址:

http://www.bloglines.com/mobile

把玩了一下,確定了只要透過 HTTP GET 傳 mobile=1 的參數過去,以後的所有存取,通通會變成 mobile 模式,反之則用 nomobile=1 將 Bloglines的首頁網址改成 http://www.bloglines.com/?mobile=1 存在 PDA 的書籤裡,就可以解決這個問題。

至於第二個問題,阿輝是說他是靠 Treo 650 的新韌體直接得到 UTF-8 中文支援。對於不是使用 Treo 650 的朋友,就沒辦法直接看大部分都是 UTF-8 編碼的 blog 了。因此,我只好自己簡單寫一個 http proxy 將 UTF-8 資料轉成 big5。這個用 PerlHTTP::Proxy 可以很方便的解決。

基本上有以下幾件事情要做:

  • 只針對 text/html 資料作轉碼。
  • HTML tag 裡也要轉碼,因為包括 titlealt 等屬性裡也可能會有 UTF-8 中文字的存在。
  • <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 與其變形要轉成 <meta http-equiv="Content-Type" content="text/html; charset=big5">
  • HTTP header 裡如果有宣告 charset,理論上也應該修正,不過因為很少人用,所以我就省掉這一項了。

第一次搞的時候,弄了很久都沒辦法連上自己的 proxy,剛剛第二次研究,才發現 HTTP::Proxy 的 host 屬性指定可以從哪些 host 連過來,或是設成 undef 不做任何限制,要不然預設只有 localhost 可以連。問題解決後,程式很快就改好了,如下:

#!/usr/bin/perl -w

use Text::Iconv;use HTTP::Proxy;use HTTP::Proxy::BodyFilter;use HTTP::Proxy::BodyFilter::tags;use HTTP::Proxy::BodyFilter::htmltext;

my $ic = Text::Iconv->new('UTF-8', 'CP950');$ic->raise_error(0);

{    package Big5ToUTF8_Filter;    use base qw(HTTP::Proxy::BodyFilter);

    sub filter    {        my ($self, $dataref, $message, $protocol, $buffer) = @_;        $dataref =~ s/<meta\s+http-equiv="Content-Type"\s+content="text\/html; charset=utf-8">/<meta http-equiv="Content-Type" content="text\/html; charset=big5">/o;        $dataref = $ic->convert($dataref);    }}

my $proxy = HTTP::Proxy->new(host => undef, port => 63128);

$proxy->logmask(HTTP::Proxy::ALL);$proxy->logfh(*STDERR);

$proxy->push_filter(    mime     => 'text/html',    response => HTTP::Proxy::BodyFilter::tags->new(),    response => Big5ToUTF8_Filter->new());

$proxy->start();

因為是使用 Text::Iconv 做轉碼,所以不一定要用 Perl 5.8.6 以上才能跑。使用的方法為,在 NetFront v3.1 的 Options -> NetFront Settings 的第二頁,把 Use Proxy 勾起來,填入 proxy 的網址,就可以看 UTF-8 的 Bloglines 了。自己測試,沒什麼問題,有興趣的朋友,可以把 proxy 設到 140.113.72.2:63130 試試看。 目前只是簡單測試,未來還要改成只針對 UTF-8 的網頁做轉碼,原本是 big5 的就不要轉了,如果是其他編碼,如 gb2312,就轉址到某說明網頁去,如此才完整。另外,為避免 proxy 被擠爆,可能還必須加上 access control 的機制。