謝謝 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
迴響 ↓
大概知道為什麼了
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 發表於 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,謝謝你了!!!很有用的!!
學到了。