websvn是subversion的一個php編寫的web介面,但使用中發現該程式對svn中的中文目錄、注釋顯示不正常,原有的中文目錄顯示成了/?/230/?/153/?/88樣子的亂碼。
由於處於安全考慮,這個系統中對php做了open_dir的限制,所以沒有使用apt來安裝websvn,而是從websvn.tigris.org下載了1.6.1的版本,最新的2.0的版本和系統預設的svn1.4.2不相容沒法使用。
經過跟蹤調試,發現websvn是通過php的popen函數來調用svn命令並讀取傳回值,但是這個返回的內容本身就是亂碼的。再進一步測試,發現popen函數的環境變數中LANG設定為C,這樣執行的svn命令,中文資訊就變成了/?/230/?/153/類的亂碼了。
知道了問題所在,修改起來就很容易了:
先修改下config.inc檔案中的編碼設定
$config->setInputEncoding("utf-8");
$config->setOutputEncoding("utf-8");
在修改下command.inc中的函數
function quoteCommand($cmd, $redirecterr)
{
global $config;
if ($redirecterr)
$cmd .= " 2>&1";
// On Windows machines, the whole line needs quotes round it so that it's
// passed to cmd.exe correctly
if ($config->serverIsWindows)
$cmd = "/"$cmd/"";
return "export LANG=zh_CN.UTF-8 && " . $cmd;
}
經過這樣簡單修改,並清除了cache中的緩衝,在重新整理顯示,嗯,一切正常了。
調試環境是debian4.0 subversion 1.4.2 websvn1.6.1 apache2.2.3 php5.2