Mark's Place

A place for Mark's murmuring, blah, blah, blah, ...

Mark's Place
Watch Timeline

在 UTF8 編碼下的網頁簡繁互轉(Server Side)

Mark Wu 發表於 2006/11/24 08:10 · 靜態連結網址

謝謝 Leeym分享,所以讓我能做到 LifeType 中文開發社群網站的即時簡繁互轉。可是因為我們兩個使用的環境有些不同,所以我必須要做一些修正後才能使用。

目前,LifeType 中文開發社群使用的伺服器版本如下:

  • Web Server:Apache 2
  • DB Server:MySQL 4.1
  • PHP:PHP 5.1
  • Perl:Perl 5.8.6

因為使用了 Apache2 所以我不需要自行編譯 mod_filter 給 Apache 使用,我只要改用 Apache 內建的 mod_ext_filter 就可以了。在 Virtual Host 的設定要改成下面的方式(請參考 Leeym 程式的第三個步驟):

www.lifetype.org.tw 的 Virtual Host 的設定:

# Virtual Host for www.lifetype.org.tw
<VirtualHost *:80>
  ServerName www.lifetype.org.tw
  DocumentRoot "/usr/local/www/lifetype"
  DirectoryIndex index.php

  <Directory ""/usr/local/www/lifetype">
    Options All
    AllowOverride All
    Order deny,allow
    Allow from all
  </Directory>
</VirtualHost>

www.lifetype.org.cn 的 Virtual Host 的設定:

# Virtual Host for www.lifetype.org.cn
<VirtualHost *:80>
  ServerName www.lifetype.org.cn
  DocumentRoot "/usr/local/www/lifetype"
  DirectoryIndex index.php
 
  ExtFilterDefine encode mode=output intype=text/html cmd="/home/lifetype/scripts/encode.pl"

  <Directory ""/usr/local/www/lifetype">
    Options All
    AllowOverride All
    Order deny,allow
    Allow from all
    SetOutputFilter encode
  </Directory>
</VirtualHost>

PS. 這裡我把 Leeym 的程式改名為 encode.pl 並且放在 /home/lifetype/scripts 下。所以你必須依照你的環境自行修改這些路徑。

因為改成 mod_ext_filter 的關係,Leeym 寫的 perl 的簡繁互轉程式,便無法透過 read(STDIN, $body, $ENV{'CONTENT_LENGTH'}) 來正確的抓到 stdin 資料,所以

my $body;
read(STDIN, $body, $ENV{'CONTENT_LENGTH'});

這兩行程式必須修改為:

my $body;
my $tmp;
while ($tmp = <STDIN>) {
  $body = $body . $tmp;
}

這樣我們才能正確的抓到 stdin 的資料。不過這樣的方法只在 Linux 可行,在 Windows 下 ActivePerl 似乎無法讀取到 Apache 的 EOF,所以會變成無窮迴圈 hang 在那邊。

其他的步驟都跟 Leeym 所講述的一樣。可是有一點要注意,如果你有使用 PHP 的 GZIP Compression 來壓縮你的 http 輸出,記得把他們關掉,否則無法正轉換。

如果一定要使用 GZIP Compression,請使用 Apache2 下面的 mod_deflate。使用方法很簡單,只要先 enable mod_deflate,然後在 www.lifetype.org.cn 的 Virtual Host 的 SetOutputFilter 設定改為:

SetOutputFilter encode;deflate

就可以了。

真實引用網址:

http://blog.markplace.net/trackback.php?id=169

迴響 (11) · 引用 (0) 文章分類: 生活形態?LifeType?

迴響 ↓

  • 大概知道為什麼了
    Mark  發表於 24/11/2006, 09:08

    我大概知道為什麼 Leeym 的程式讀不到 stdin 的資料。

    因為 mod_ext_filter 是用執行 local 端 script 的方式來做 http 輸出的 filter。而 Leeym 原來的程式是用 cgi 的方式來執行,所以 用 read 方式來讀, content_length 為 0。

    所以應該是差在這邊吧!

  • 請幫個忙!
    Pez  發表於 24/11/2006, 10:15

    版主您好:
    我是世新大學的學生,
    目前正在從事部落格的研究,
    想請您幫個忙、填份問卷。
    可以的話還望您多多轉寄、宣傳,
    在此先謝過您了!
    詳細資訊請至:
    http://blog.yam.com/orangefish/archives/2516494.html

  • 回覆: 在 UTF8 編碼下的網頁簡繁互轉(Server Side)
    mickey9801  發表於 26/11/2006, 01:39

    謝謝Mark,又學到新的事情了。

  • 回覆: 在 UTF8 編碼下的網頁簡繁互轉(Server Side)
    mickey9801  發表於 26/11/2006, 10:09

    您好,看過Mark的教學後,小弟大致上已經架起了簡體網誌了。由於在小弟用的Fedora Core 3裡面,Perl是放在/usr/bin目錄的,所以也修改了encode.pl的第一行。不過還有好幾個問題想請教一下:

    1. 在encode.pl裡,「print "Content-Type: text/htmlnn";」這一行是不是必要的?我想這句原本應該是header的一部份吧,不過轉到簡體網址的時候卻印了出來。把它拿掉後看來又沒有甚麼事發生。

    2. 小弟有點貪心,也想開啟次網域功能,不過encode.pl裡以下兩句是不是也需要修改呢?
    my $zh_tw = 'http://blog.comicparty.com';
    my $zh_cn = 'http://blog.cn.comicparty.com';

    3. 小弟試了在未修改上面兩句情況下開啟了次網域功能,不過就發覺無論如何也總是跳到預設的網誌去。小弟在.htaccess裡加入了DirectoryIndex index.html summary.php index.php,如果沒有輸入次網域或指定存取index.php的話,應該是會見到摘要頁的,但是在簡體網址使用了次網域的話,即使指定了summary.php,顯示的結果還是預設網誌。頁面上的連結都指向錯誤地指回繁體網址。

    我想這個跟次網域網址重寫有關,小弟現在的設定是http://{username}.blog.comicparty.com:8080,而目標的簡體網址是http://{username}.blog.cn.comicparty.com:8080。要怎麼設定才可以同時對應到繁簡兩個不同的網址呢?

    謝謝。

  • mmm ...
    Mark  發表於 26/11/2006, 16:47

    1. 這一行 "print "Content-Type: text/htmlnn";" 的確應該拿掉,我忘了寫。

    2. 修改成下面這樣如何?
    my $zh_tw = 'blog.comicparty.com';
    my $zh_cn = 'blog.cn.comicparty.com';

    3. 基本上還是寫 {username}.blog.comicparty.com:8080。因為網址的轉換,不是透過 LifeType 幫你換,而是透過 encode.pl。

    Mark

  • 回覆: 在 UTF8 編碼下的網頁簡繁互轉(Server Side)
    mickey9801  發表於 27/11/2006, 05:21

    看來還是不行,即使拿掉'http://'還是會自動跳到預設網誌,而無法去到summary.php

  • Hi
    leebel  發表於 02/11/2007, 03:49

    Hello Mark,

    我是一位MIS,正在煩腦如何將整個網站繁轉簡 或是簡轉繁
    請問encode.pl 還有開放嗎?
    開放的話我要如何拿到 ?
    Leeym 那邊的好像已經拿掉了 ~
    他blog上好像也不能leave message 了~

  • 關於這隻 encode.pl 的程式
    eastevil  發表於 27/02/2008, 17:53

    不知道是否願意可以在提供這隻 encode.pl 下載呢?因為要做一個專題報告

  • markwu

    我目前手邊也拿不到~
    markwu  發表於 04/03/2008, 01:51

    不好意思,我也沒備份,目前手邊也拿不到。

  • 回覆: 在 UTF8 編碼下的網頁簡繁互轉(Server Side)
    health  發表於 29/10/2008, 10:09

    good post!!thanks!!

  • 回覆: 在 UTF8 編碼下的網頁簡繁互轉(Server Side)
    coopo  發表於 05/12/2008, 03:48

    Mark,謝謝你了!!!很有用的!!
    學到了。