TWiki 的 BlogPlugin 所採用的 TWikiForm 的方式在運作的,然而 TWikiForm 則是透過 renderForEdit 預先拆解文件後才轉為 Form 提供重新編寫,會出現亂碼。問題在於 Form.pm 當中的 renderFieldForEdit() 採用了 CGI::textarea() CGI::textfield() 等將文件的內容切割成數個欄位提供編輯使用。
解決方法?有是有啦,不過不是什麼很好的方法,而且就我自己看來,這個解法還真的有點無賴。
不是直接修改 TWiki 或是 BlogPlugin 的任何地方。因為這個問題其實是 CGI.pm 的 default charset 的問題。其實應該也可以修改 TWiki 的主程式讓他可以在乎叫 CGI.pm 的時候,先把 default charset 設定好,但是要改的地方可能會讓人發瘋,所以小弟我採用了最偷懶的方法,而且一定有效的方法。
請找到你的 CGI.pm 是裝在那裡,如果很不幸的,你又裝了一堆版本的 perl 和 perl extensions,包括 CGI.pm,那請你一定要搞清楚你目前真正使用到的版本是哪一個?
FreeBSD 上內建的是: /usr/local/lib/perl5/5.8.8/CGI.pm
如果有自己裝 CGI.pm ports 的話,則是: /usr/local/lib/perl5/site_perl/5.8.8/CGI.pm
找到 CGI.pm 之後,編輯他。在程式裡面有一行
$self->charset('ISO-8859-1');
這個就是問題的來源,既然我們都已經採用 UTF-8 的編碼系統來解決字碼的問題,那就乾脆把這一行換成:
$self->charset('UTF-8');
然後就天下太平了。這個當然不是什麼正式的解決方法,不過「有效」!有效最重要。