由于处于安全考虑,这个系统中对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